Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Servlet上的空指针异常_Java_Android_Client Server - Fatal编程技术网

Java Servlet上的空指针异常

Java Servlet上的空指针异常,java,android,client-server,Java,Android,Client Server,我的DH密钥交换应用程序快完成了。我现在尝试在我的应用程序上验证我的客户端。 但是,我的服务器上不断出现空指针异常。我将问题追溯到我的大整数变量,但我没有发现任何问题 我正在尝试向客户端发送1或0的响应。 1表示已验证,0表示未验证 我将显示发生错误的部分 DHServlet.java public class DHServlet extends HttpServlet { private static final long serialVersionUID = 1L; private stat

我的DH密钥交换应用程序快完成了。我现在尝试在我的应用程序上验证我的客户端。 但是,我的服务器上不断出现空指针异常。我将问题追溯到我的大整数变量,但我没有发现任何问题

我正在尝试向客户端发送1或0的响应。 1表示已验证,0表示未验证

我将显示发生错误的部分

DHServlet.java

public class DHServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static String pk2;
private static String pCValue;
private static String gCValue;
private static String sCValue;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
   // PrintWriter out2=response.getWriter();
    DH getDH = new DH();



    try {
    String un,pw,pk;

    Random randomGenerator = new Random();

    long pValue = randomGenerator.nextInt(100000000);
    long gValue = randomGenerator.nextInt(100000000);

    boolean checkPrime = getDH.isPrime(pValue);

    while(checkPrime == false)
    {
        long generatePValue2 = randomGenerator.nextInt(10000000);
        boolean checkPrime2 = getDH.isPrime(generatePValue2);
        if(checkPrime2==true)
        {
            pValue=generatePValue2;
            break;
        }
    }

   long checkSP = (pValue*2)+1;
   boolean checkSafePrime = getDH.isPrime(checkSP);

   while(checkSafePrime == false)
   {
       long generatePValue3 =  randomGenerator.nextInt(100000000);
       boolean checkSpInLoop = getDH.isPrime(generatePValue3);
       long checkSP2 = (generatePValue3*2)+1;
       boolean checkSafePrimeInLoop = getDH.isPrime(checkSP2);

       if(checkSpInLoop ==  true && checkSafePrimeInLoop == true)
       {
           pValue = generatePValue3;
           break;
       }
   }

   while(gValue>pValue)
   {
       long gValue2=randomGenerator.nextInt(100000000);
       if(gValue2<pValue)
       {
           gValue=gValue2;
           break;
       }
   }

   long getDivisor =(pValue-1)/2;
   BigInteger bi1,bi2,bi3,bi4;

   bi1=BigInteger.valueOf(getDivisor);
   bi2=BigInteger.valueOf(pValue);
   bi3=BigInteger.valueOf(gValue);
   bi4=bi3.modPow(bi1,bi2);

   long calculatedValue = bi4.longValue();

   while(calculatedValue == 1)
   {
       long gValue3=randomGenerator.nextInt(100000000);
       long getDivisorInLoop = (pValue-1)/2;
       BigInteger bi5,bi6,bi7,bi8;

       bi5=BigInteger.valueOf(getDivisorInLoop);
       bi6=BigInteger.valueOf(pValue);
       bi7=BigInteger.valueOf(gValue3);
       bi8=bi7.modPow(bi5, bi6);

       long calculatedValueInLoop = bi8.longValue();

       if(calculatedValueInLoop != 1)
       {
           gValue=gValue3;
           break;
       }

   }

   BigInteger generatorValue,primeValue,skA,biPKA;
   generatorValue = BigInteger.valueOf(gValue);
   primeValue = BigInteger.valueOf(pValue);
   long secretKeyA = getDH.generateSKA();
   skA=BigInteger.valueOf(secretKeyA);
   biPKA =getDH.generatePkA(generatorValue, primeValue, secretKeyA);
   System.out.println("The public key of server is "+biPKA);
   System.out.println("The generator value is "+generatorValue);
   System.out.println("The prime value is "+primeValue);
   System.out.println("the secret key of the server is "+skA);

   long PKA = biPKA.longValue();

   out.print(pValue+":"+gValue+":"+PKA);


   pk2=biPKA.toString();
   pCValue=primeValue.toString();
   gCValue=generatorValue.toString();
   sCValue=skA.toString();




    } finally {            
        out.close();
    }
}



protected void processRequest2(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    DH getDH2=new DH();
    String un,pw,pk,shareK;

    try
    {
        pk=request.getParameter("publicK");
        un=request.getParameter("username");
        pw=request.getParameter("password");
        shareK=request.getParameter("sharedKey");

        String publicKey = pk;

        BigInteger biPK,biSK,biP,sKey;
        biPK = new BigInteger(publicKey);
        biSK = new BigInteger(sCValue);
        biP = new BigInteger(pCValue);

        System.out.println(biPK);
        sKey = getDH2.calculateSharedKey(biPK, biSK, biP);
        String sharedServerKey = (sKey.toString()).trim();
        System.out.println("the shared key is "+sharedServerKey);
        if(un.equalsIgnoreCase("larry")&& pw.equals("123") && sharedServerKey == shareK)
        {
            out.print(1);

        }
        else
        {
            out.print(0);
        }

    }finally
    {
        out.close();
    }



}




/**
 * @see HttpServlet#HttpServlet()
 */
public DHServlet() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    processRequest(request,response);
    processRequest2(request,response);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    processRequest2(request,response);
}
公共类DHServlet扩展了HttpServlet{ 私有静态最终长serialVersionUID=1L; 私有静态字符串pk2; 私有静态字符串值; 私有静态字符串值; 私有静态字符串值; 受保护的void processRequest(HttpServletRequest请求、HttpServletResponse响应) 抛出ServletException、IOException{ setContentType(“text/html;charset=UTF-8”); PrintWriter out=response.getWriter(); //PrintWriter out2=response.getWriter(); DH getDH=新DH(); 试一试{ 字符串un,pw,pk; Random randomGenerator=新的Random(); 长pValue=randomGenerator.nextInt(100000000); long gValue=randomGenerator.nextInt(100000000); 布尔checkPrime=getDH.isPrime(pValue); while(checkPrime==false) { long generatePValue2=randomGenerator.nextInt(10000000); 布尔checkPrime2=getDH.isPrime(generatePValue2); 如果(checkPrime2==true) { pValue=generatePValue2; 打破 } } 长校验SP=(pValue*2)+1; 布尔checkSafePrime=getDH.isPrime(checkSP); while(checkSafePrime==false) { long generatePValue3=randomGenerator.nextInt(100000000); 布尔checkSpInLoop=getDH.isPrime(generatePValue3); 长校验SP2=(generatePValue3*2)+1; 布尔值checkSafePrimeInLoop=getDH.isPrime(checkSP2); if(checkSpInLoop==true&&checkSafePrimeInLoop==true) { pValue=generatePValue3; 打破 } } while(gValue>pValue) { long gValue2=随机生成器.nextInt(100000000);
如果(gValue2您的stacktrace说您的一个大整数有问题(pk、un或pw中的一个为null)

那么例外情况很明显:

    pk=request.getParameter("publicK");
    un=request.getParameter("username");
    pw=request.getParameter("password");
    shareK=request.getParameter("sharedKey");

    BigInteger biPK,biSK,biP,sKey;
    biPK = new BigInteger(pk);
    biSK = new BigInteger(sCValue);
    biP = new BigInteger(pCValue);
由于您的任何变量,
pk
sCValue
pCValue
null
,因此您将得到一个
null点异常

pk=request.getParameter("publicK");
un=request.getParameter("username");
pw=request.getParameter("password");

顺便问一下,变量
sCValue
pCValue
在哪里初始化?

在这种情况下,会发生NullPointerException,因为您将
null
的值传递给
BigInteger
的构造函数

stacktrace告诉您调用它的行号:
DHServlet.java:158

假设线路如下所示

biPK = new BigInteger(pk);

然后,
pk
为null。

您可能正在使用
null
字符串实例化
biginger
。任何或所有请求参数都是
null

pk=request.getParameter("publicK");
un=request.getParameter("username");
pw=request.getParameter("password");

其中一个变量:
pk、sCValue或pCValue
null
,因为我不知道
Servlet
中的第158行是什么


你不能用null作为参数实例化
biginger

它是主类上的一个全局变量。我将编辑顶部的代码部分,然后检查
pk
是否为null,并逐行调试每个变量。这就是那一行,但是我如何知道该变量是否为null。我打印了该变量,其中包含一个value.如果我错了,请纠正我,我在doGet方法上对processRequest2进行了注释。代码工作正常,但是当它未注释时,会发生空指针异常。这是因为吗?@Clearner88是的,因为如果您查看堆栈跟踪,您会发现您的问题在
DHServlet
的第158行这一行是?嗯,这很奇怪。我用isEmpty方法检查了所有的值。它们都返回false这是行biPK=new biginger(publicKey);这意味着
publicKey
为null