2015-03-27 4 views
0
String Dept = request.getParameter("dept"); 
int NumOfEmp = Integer.parseInt(request.getParameter("EmployeeNum")); 

if(null != Dept && !Dept.isEmpty()){ 
     // add criteria for Name 
     query += " AND DeptName = '"+ Dept + "'"; // prefer parametrized query 
    } 

    if(NumOfEmp > 0){ 

     // add criteria for Age 
     query += " AND NumberOfEmployees = "+ NumOfEmp ; // prefer parametrized query 
    } 

System.out.println("QUERY ......... " + query); 
pst = c.prepareStatement(query); 

Запрос, который получает формируется выглядит просто отлично:Исключение java.lang.NumberFormatException: нуль в сервлетах

вот что я получил:

select DeptName, NumberOfEmployees from Departments where 1 = 1 AND 

     NumberOfEmployees = 50 

Запрос выглядит хорошо для меня, но только после печати запроса, отметив, что оно напечатано на консоли. Тогда если я явно вызвать URL, это дает исключение, которое говорит:

Exception java.lang.NumberFormatException: null 

строка данных, что я перешел от AJAX:

var dataString ={ "EmployeeNum" : "50"}; 

Как я могу решить эту проблему, что, кажется, вопрос здесь?

Edit: Вот полный код:

пакет com.Charts;

/** 
* Servlet implementation class DBChart 
*/ 
@WebServlet("/db") 
public class DBChart extends HttpServlet 
{ 
Connection c = null; 
//Statement st = null; 
ResultSet rs = null; 
String query = null; 
JSONObject obj = null; 
JSONObject resobj =null; 
PreparedStatement pst = null; 
//DatabaseMetaData dbmd = null; 
String dbURL="jdbc:sqlserver://localhost:1433; databaseName = EMPLOYEE"; 
String user = "sa"; 
String password = "minisiminoni"; 
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{ 
try 
{ 
List<JSONObject> Details = new LinkedList<JSONObject>(); 
PrintWriter out = response.getWriter(); 
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
c = DriverManager.getConnection(dbURL, user, password); 
query = "select DeptName, NumberOfEmployees from Departments where 1 = 1"; 
String Dept = ""; 
try 
{ 
Dept = request.getParameter("dept"); 
} 
catch(Exception e) 
{ 
System.out.println("request param dept " + e); 
} 
String EmployeeNum= ""; 
try 
{ 
EmployeeNum = request.getParameter("EmployeeNum"); 
} 
catch(Exception e) 
{ 
System.out.println("error in get param" + e); 
} 
int NumOfEmp; 
try { 
    NumOfEmp = Integer.parseInt(EmployeeNum); 
} catch(NumberFormatException e){ 
    StringBuilder sb = new StringBuilder(); 
    sb.append("Error parsing this EployeeNum: "); 
    sb.append(EmployeeNum); 
    e.printStackTrace(); 
    throw new RuntimeException(sb.toString()); 
} 

if (Dept != null && !Dept.isEmpty()) { 
     // add criteria for Name 
     query += " AND DeptName = '"+ Dept + "'"; // prefer parametrized query 
    } 
    if (NumOfEmp > 0) { 
    // add criteria for Age 
     query += " AND NumberOfEmployees = "+ NumOfEmp ; // prefer parametrized query 
    } 
System.out.println("QUERY ......... " + query); 
pst = c.prepareStatement(query); 
resobj = new JSONObject(); 
while(rs.next()) 
{ 
String DeptName = rs.getString(1); 
System.out.println("name " + DeptName); 
int NumberOfEmployees = rs.getInt(2); 
System.out.println("num " + NumberOfEmployees); 
obj = new JSONObject(); 
obj.put("DeptName", DeptName); 
obj.put("NumberOfEmployees",NumberOfEmployees); 
Details.add(obj); 
} 
resobj.put("Details", Details); 
out.write(resobj.toString()); 

} 
catch(Exception e) 
{ 
System.out.println("Exception " + e); //only this is where exception is caught 
} 
} 
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    doGet(request, response); 
    } 
} 

консоли:

INFO: QUERY ......... select DeptName, NumberOfEmployees from Departments where 1 = 1 AND NumberOfEmployees = 50 
2015-03-27T14:32:30.604+0530|SEVERE: SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6] 
2015-03-27T14:32:30.604+0530|SEVERE: SLF4J: See http://www.slf4j.org/codes.html#version_mismatch for further details. 

После то ничего:

Тогда, если я явно идти на сервлет URL, я получаю это:

2015-03-27T14:33:58.670+0530|INFO: Exception java.lang.NumberFormatException: null 

Вот мой Аякса вызов:

<script type="text/javascript"> 
      var dataString ={ "EmployeeNum" : "50"}; 
      var queryObject=""; 
      var queryObjectLen=""; 
      console.log("loading"); 
      google.load('visualization', '1.0', {'packages':['corechart']}); 
google.setOnLoadCallback(function() { 
    $.ajax({ 
     type : 'POST', 
     data: dataString, 
     url : 'http://localhost:8080/Charts/db', 
     success : function(data) { 
     alert("success"); 
      queryObject = jQuery.parseJSON(data);    
      queryObjectLen = queryObject.Details.length; 
      console.log("queryObj: "+queryObject+" Length: "+queryObjectLen); 
      drawChart(); 
     }, 
     error : function(xhr, type) { 

      alert('server error occoured') 
     } 
    }).done(function(msg) { 
      alert("aa gya Response: " + msg); 
     }); 
}); 
+1

Опубликовать всю трассировку стека !!! он лучше объяснит, на какой линии вы получаете это исключение! –

+0

Возможна ссылка на соединение. Переменная 'c', возможно, еще не инициализирована !! –

+0

Я использую GlassFish, и в stacktrace нет ничего другого. –

ответ

1

Есть много исправлений в код

первый: SQL Query
ли вам действительно нужно это 1 = 1 это smeels как SQL Injection .. поэтому удалить его

второго кода Java
A. Всегда try{}catch(){} кодовые блоки, которые могут генерировать исключение;
B. Всегда печатайте подробное сообщение об ошибке;
C. Необходимо использовать log4j для ex;

3-й Бизнес-правила
A. Вы должны проверить, если количество сотрудников, как вы ожидаете, что Великий или равно нулю
B. Предотвратить ваш код от SQL инъекций

Попробуйте с этим кодом

String Dept = request.getParameter("dept"); 
String EmployeeNum = request.getParameter("EmployeeNum"); 
try { 
    int NumOfEmp = Integer.parseInt(EmployeeNum); 
} catch(NumberFormatException e){ 
    StringBuilder sb = new StringBuilder(); 
    sb.append("Error parsing this EployeeNum: "); 
    sb.append(EmployeeNum); 
    e.printStackTrace(); 
    throw new RuntimeException(sb.toString()); 
} 

if (Dept != null && !Dept.isEmpty()) { 
     // add criteria for Name 
     query += " AND DeptName = '"+ Dept + "'"; // prefer parametrized query 
    } 
    if (NumOfEmp > 0) { 
    // add criteria for Age 
     query += " AND NumberOfEmployees = "+ NumOfEmp ; // prefer parametrized query 
    } 
System.out.println("QUERY ......... " + query); 
pst = c.prepareStatement(query); 
+0

Эй, я попробовал это, и у меня все еще есть точно такое же поведение. Я получаю исключение, когда я явно вызываю URL-адрес, иначе консоль печатает, пока не сформирован запрос, а затем ничего. –

Смежные вопросы