无法克服exam.jsp中的空指针异常

时间:2016-04-14 12:53:31

标签: jsp

我正在使用oracle数据库在java中创建一个在线考试系统,html ...页面在.jsp中。我在eclipse中运行代码。除了空指针异常,我尝试运行exam.jsp时,我得到的错误似乎正常。我正在上传代码和错误的屏幕截图: enter image description here

 <%@ page language="java" import="co.etest.quiz.Exam" 
 contentType="text/html;     charset=ISO-8859-1"
 pageEncoding="ISO-8859-1"%>

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"     

 <html>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Quiz</title>
 <style type="text/css">
 body {
 background:     
 url("${pageContext.request.contextPath}/images/background.jpg");
 }
 </style>

 </head><br/>
 <body>
 <div style="position:absolute;left:50px;top:20px">

 <%
 int currentQuestion=       
(`enter code here`   (Exam)request.getSession().getAttribute("currentExam")).getCurrentQuestion();
// System.out.println("Question Number "+currentQuestion+ " retrieved ");
 %>
Current Question ${sessionScope.quest.questionNumber+1} / 10
</div>


<div style="position:absolute;width:1000px;padding:25px;
height: 200px;border: 1px solid green ;left:100px;top:60px">
<span>${sessionScope.quest.question}</span><br/><br/>
<form action="exam" method="post" >
<c:forEach var="choice" items="${sessionScope.quest.questionOptions}" 
 varStatus="counter">
<input type="radio" name="answer" value="${counter.count}" >${choice}  <br/>
</c:forEach> <br/> 

 <%
 if(currentQuestion > 0)
{
%>
<input type="submit" name="action" value="Previous" />
<%} %>

<%
if(currentQuestion < 9)
{
%>
<input type="submit" name="action" value="Next" />
<%} %>
<input type="submit" name="action" value="Finish Exam" />

</form>
</div>


</body>
</html>

2 个答案:

答案 0 :(得分:0)

尝试访问空对象时抛出NullPointerException。在图片中的堆栈跟踪中,您显然可以看到它指向第21行:

int currentQuestion = ((Exam)request.getSession().getAttribute("currentExam")).getCurrentQuestion();

这意味着此行中的某些内容为null,您仍在尝试访问它。您只是尝试访问requestrequest.getSession()request.getSession().getAttribute("currentExam"))

导致问题的最可能的原因是request.getSession().getAttribute("currentExam"))返回null。在运行代码之前,请尝试检查它是否为空。

您可能需要查看herehere

答案 1 :(得分:0)

 can u please tell me about it in a bit of detail...
 i am uploading another code ExamController.java which contains the        
 request.getSession().getAttribute("currentExam) method

package co.etest.quiz.controller;

import java.io.IOException;


import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import co.etest.quiz.Exam;
import co.etest.quiz.QuizQuestion;

/**
* Servlet implementation class ExamController
*/
 @WebServlet("/exam")
public class ExamController extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse     
response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request,response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse       
response) throws ServletException, IOException {
    // TODO Auto-generated method stub

    boolean finish=false;

    HttpSession session=request.getSession();       
    try
    {
    if(session.getAttribute("currentExam")==null)
    {  session=request.getSession();    
    String selectedExam= 
    (String)request.getSession().getAttribute("exam"); 
    System.out.println("Setting Exam "+selectedExam);
    Exam newExam=new Exam(selectedExam);          
    session.setAttribute("currentExam",newExam);
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd    
    HH:mm:ss a");
    Date date = new Date();
    String started=dateFormat.format(date);
    session.setAttribute("started",started);
    }

    }catch(Exception e){e.printStackTrace();}

    Exam exam=(Exam)request.getSession().getAttribute("currentExam");       

    if(exam.currentQuestion==0){    
    exam.setQuestion(exam.currentQuestion);
    QuizQuestion q=exam.questionList.get(exam.currentQuestion); 
    session.setAttribute("quest",q);
    }
    String action=request.getParameter("action");

    String radio=request.getParameter("answer");
    int selectedRadio=-1;
    exam.selections.put(exam.currentQuestion, selectedRadio);
    if("1".equals(radio))
    {
    selectedRadio=1;
    exam.selections.put(exam.currentQuestion, selectedRadio);
    System.out.println("You selected "+selectedRadio);
    }
    else if("2".equals(radio))
    {
    selectedRadio=2;
    exam.selections.put(exam.currentQuestion, selectedRadio);
    System.out.println("You selected "+selectedRadio);
    }
    else if("3".equals(radio))
    {
    selectedRadio=3;
    exam.selections.put(exam.currentQuestion, selectedRadio);
    System.out.println("You selected "+selectedRadio);
    }
    else if("4".equals(radio))
    {
    selectedRadio=4;
    exam.selections.put(exam.currentQuestion, selectedRadio);
    System.out.println("You selected "+selectedRadio);
    }


    if("Next".equals(action)){
    exam.currentQuestion++;
    exam.setQuestion(exam.currentQuestion);
    QuizQuestion q=exam.questionList.get(exam.currentQuestion); 
    session.setAttribute("quest",q);
    }
    else if("Previous".equals(action))
    {   System.out.println("You clicked Previous Button");
    exam.currentQuestion--;
    exam.setQuestion(exam.currentQuestion);
    QuizQuestion q=exam.questionList.get(exam.currentQuestion); 
    session.setAttribute("quest",q);
    }
    else if("Finish Exam".equals(action))
    {   finish=true;
    int result=exam.calculateResult(exam);              
    request.setAttribute("result",result);
    request.getSession().setAttribute("currentExam",null);
    request.getRequestDispatcher("result.jsp").forward(request,response);       

    }

    if(finish!=true){
    request.getRequestDispatcher("exam.jsp").forward(request,response);
    }

    }

    }