2014-04-25 3 views
1
1.for (Field field : fields) { 
2. if (p.contains(field.getName())) { 
3.  if(field.getType().toString().split("[.]")[2].equals("String")) 
4.   callableStatement.setString(field.getName(), field.get(obj).toString()); 
5.  else if(field.getType().toString().split("[.]")[2].equals("Integer")) 
6.   callableStatement.setInt(field.getName(), (int)field.get(obj)); 
7.  System.out.println(field.get(obj).toString()); 
8. } 
9.} 

이것은 내 코드입니다. 리플렉션을 사용하여 클래스 객체에서 데이터를 가져오고 위 루프에서 프로 시저 입력에 대한 매개 변수를 설정합니다. 그러나, 어떤 정수 값을 저장하고이 값이 허용됩니다 7.반사 : 예외 java.lang.NullPointerException

라인 수에 일부 java.lang.NullPointerException가 발생합니다 :

this.DI_StDate = Common.getDateStamp(date); // Integer 
this.DI_StTime = Common.getTimeStamp(date); // Integer 

Common.java에서

public static Integer getDateStamp(Date d) { 
    return Integer.parseInt(requiredDate.format(d)); 
} 

public static Integer getTimeStamp(Date d) { 
    return Integer.parseInt(requiredTime.format(d)); 
} 

여기에는 예외가 발생합니다 :

this.FileOpsId = new Integer(1);   // Integer 
this.FileTypeOpsId = 1;      // Integer 

내가 잘못하고있는 곳을 제안하십시오.

public class DIConnect { 
    public Integer PROC_ID; 
    public String APIKey; 
    public String Username; 
    public String pwd; 
    public String StreamKey; 

    public Integer DI_StDate; 
    public Integer DI_StTime; 

    public String FileNamePath; 
    public Integer FileOpsTypeId; 
    public String ConfigLabel; 
    public Integer FileOpsId; 

    public Integer End_Date; 
    public Integer End_Time; 

    public DIConnect(String FileNamePath, String ConfigLabel, Integer FileOpsTypeId, Integer StartDate, Integer StartTime) { 
     this.FileNamePath = FileNamePath; 
     this.ConfigLabel = ConfigLabel; 
     this.FileOpsTypeId = FileOpsTypeId; 
     this.DI_StDate = StartDate; // accepted 
     this.DI_StTime = StartTime; // accepted 
     this.FileOpsId = new Integer(1); // NOT ACCEPTED 
    } 
} 

이 main() 메소드의 호출입니다 :

내 클래스 회원입니다.

DIConnect DIC = new DIConnect(filePath, "File", 1, Common.getDateStamp(date), Common.getTimeStamp(date)); 
DIC.InsertFileOperation(); 

DIConnect.java :

public Integer InsertFileOperation() { 
     String[] params = {"FileNamePath", "FileOpsId", "ConfigLabel", "DI_StDate", "DI_StTime"}; 
     DatabaseOperation db = new DatabaseOperation(); 
     if(db.openConnection()) { 
      this.PROC_ID = db.executeProcedure("sp_InsertIntoFileOpsMaster", params, this); 
      db.closeConnection(); 
     } 
     return this.PROC_ID; 
    } 

Database.java

public Integer executeProcedure(String proc, String[] params, Object obj) { 
     int Id = 0; 
     try { 
      String paramString = StringUtils.repeat("?, ", params.length + 1).trim(); 
      paramString = paramString.substring(0, paramString.length() - 1); 
      proc = "{CALL " + proc + "(" + paramString + ")}"; 
      callableStatement = conn.prepareCall(proc); 

      Class cls = obj.getClass(); 
      Field[] fields = cls.getFields(); 
      List<String> p = Arrays.asList(params); 

      for (Field field : fields) { 
       if (p.contains(field.getName())) { 
        if(field.getType().toString().split("[.]")[2].equals("String")) 
         callableStatement.setString(field.getName(), field.get(obj).toString()); 
        else if(field.getType().toString().split("[.]")[2].equals("Integer")) 
         callableStatement.setInt(field.getName(), (int)field.get(obj)); 
        System.out.println(field);       
//     System.out.println(field.get(obj).toString()); 
       } 
      } 
      callableStatement.registerOutParameter("Id",java.sql.Types.INTEGER); 
      callableStatement.executeUpdate(); 
      Id = callableStatement.getInt("Id"); 

     } catch (SQLException | IllegalArgumentException | IllegalAccessException ex) { 
      Logger.getLogger(DatabaseOperation.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (Exception ex){ 
      System.out.println(ex.getMessage()); 
     } finally { 
      return Id; 
     } 
    } 

OUTPUT

public java.lang.Integer airteldemo.DIConnect.DI_StDate 
public java.lang.Integer airteldemo.DIConnect.DI_StTime 
public java.lang.String airteldemo.DIConnect.FileNamePath 
public java.lang.String airteldemo.DIConnect.ConfigLabel 
null 
+2

'필드'를 인쇄하려고하면 어떻게됩니까? – mok

+0

'field.getName()'은 필드의 이름, 즉 FileOpsId와 FileTypeOpsId를 제공합니다. 또한,'(int) field.get (obj) .value'는 값을 제공합니다. –

+3

그냥'field'를 출력 해주세요 : (System.out.print (field)) 예외를 얻은 행에서 정확히 결과가 무엇인지 확인하십시오. – mok

답변

0

버그를 발견했습니다. callablestatement는 호출 된 프로 시저의 서명을 가져옵니다. 매개 변수는 대소 문자를 구분하는 매개 변수로 전달되어야합니다. 내 절차가 FileOpsTypeID으로 접수되었고 나는 FileOpsTypeId을 전달했습니다. 사건을 바꾸면 효과가있었습니다.

지연된 응답은 죄송합니다. 또한 미안하지만, 나는 완전한 세부 사항 (절차)을 제공하지 않았다.

1

나는 짐작으로는 field.get(obj)는 (때로는) 그래서 당신을 null을 반환 null 또는 코드의 논리에 따라 어떻게 든 null이되지 않도록 확인해야합니다.

내가 제공 한 정보를 바탕으로 답변을 올리면 문제의 원인이 아닌 문제의 원인을 알릴 수 있습니다.

+0

다른 질문을하거나 (의견이 아닌) 게시물에 필요한 정보를 추가하여 모든 사람 (나를 포함하여)이 올바르게 이해할 수 있도록 제안합니다. – mok

+0

전제 조건을 업데이트했습니다. –

+0

'if (p.contains (field.getName())) {'정상적으로 실행되면'field'는 null이 될 수 있습니까? –

1

코드에 몇 가지 문제가 있습니다.


먼저 필드는 Java에서 null 값을 가질 수 있습니다. 만약 당신이 타입 Object의 인수를 취하고 있다면 이것을 받아 들여 null 값을 아마도 데이터베이스 컬럼 타입에 대한 추론을 기반으로 한 SQL 값으로 매핑하면됩니다.

대신 field.get(obj).toString()를 사용하는 null 필드 값 작업 String.valueOf(field.get(obj))


else if(field.getType().toString().split("[.]")[2].equals("Integer")) 

java.lang.Integer 그렇게는 ClassCastException로 실패 할 수 있습니다 가정하기 때문에 고장없는 둘째 사용하지 않는 (Integer) nullint 값과 일치하지 않으므로 null 안전하고는 IndexOutOfBoundsException으로 실패 할 수 있습니다.은 shortpackage.Integer과 비슷합니다.

대신

Integer.class.equals(field.getType()) || Integer.TYPE.equals(field.getType()) 

Integer.TYPEint 원시 형의 의사 클래스입니다 않습니다.


셋째, 자신 만의 데이터베이스 추상화 레이어를 작성하는 것 같습니다. 거기에는 많은 ORB가 있습니다. 대신 그 중 하나를 사용하는 것이 좋습니다.

+0

흠 ... 예외를 생성하는 정수 형식에 대한 기본값을 전달하고 있습니다. 외부 제품 사용에 대한 귀하의 조언을 구할 것입니다. 그러나 어쨌든 내 솔루션에 대한 대답은 무엇입니까? –

+0

@SameerAnand, 문제의 근원은'! field.getType(). isPrimitive()'인 경우'field.get (obj)'가 null 일 수 있다는 것입니다. null이 될 수 있으므로 null 결과를 계획해야합니다. –

+0

하나의 작은 것, 나는'ClassCastException' 대신에'NullPointerException'으로 실패 할 것입니다. 숫자 형이 아닌 경우 클래스 캐스팅 예외가 발생합니다. 'Number'에서 전달 된대로'.intValue()'를 호출하여 unboxed되고 NPE가 발생합니다. –

관련 문제