程序执行Java时抛出NullPointerException

时间:2016-09-16 14:14:24

标签: java

我用非常有限的知识制作了一个非常简单的使用Java的控制台计算器。

程序必须只对两个数字执行基本的数学函数(+, - ,*,/)。该程序在开头要求提供两个String值,即inpmodeoutmodeinpmode是用户输入两个数字的模式(两个模式是" dec"用于十进制输入," bin"用于二进制输入)。 outmode是用户希望显示其结果的模式。此信息(inpmodeoutmode)被写入文本文件并存储在某处,然后程序继续询问价值并相应地显示结果。显示结果后,用户有三个选项,要退出,要继续使用相同的模式,要更改模式。这一直持续到用户选择退出。

Here's a simple flowchart I made for the purpose.

这是我糟糕的代码:

import java.io.*;
import java.util.*;

class FileTry {
    Scanner sc=new Scanner(System.in);
    String inpmode="";
    String outmode="";
    FileWriter fw;
    BufferedWriter bw;
    PrintWriter pw;
    String n1,n2;
    FileReader fr;
    BufferedReader br;
    String read;
    String arr[]=new String[2];
    int nu2,res,i=0;
    String op; int nu1=nu2=res=0;


    void main(){
        try { 
            fr=new FileReader("C:\\Users\\dell pc\\Desktop\\tryer.txt");
            askdata();

        }

        catch (IOException e) {
            try
            { 
                System.out.println("File needs to be created first");
                fw=new FileWriter("C:\\Users\\dell pc\\Desktop\\tryer.txt");
                bw=new BufferedWriter(fw);
                pw=new PrintWriter(bw);
                askuser();
            }
            catch(IOException a){
                System.out.println("Error"); 
            }
        }

    }

    void askuser()
    {

        System.out.println("Input mode?");
        inpmode=sc.nextLine();
        System.out.println("Output mode?");
        outmode=sc.nextLine();
        modewriter();
    }

    void modewriter()
    {

        try
        {
            pw.println(inpmode);
            pw.println(outmode);
            pw.close();
            bw.close();
            fw.close();
        }

        catch(IOException b)
        {   
            System.out.println("error"); 

        }
        askdata();
    }

    void askdata()
    {

        System.out.println("Enter num 1");
        n1=sc.nextLine();
        System.out.println("Enter num 2");
        n2=sc.nextLine();
        System.out.println("Enter the operation");
        op=sc.nextLine();
        reader();
    }

    void reader() 
    {

        int i=0;
        try 
        {
            Scanner fileScanner=new Scanner(new File("C:\\Users\\dell pc\\Desktop\\tryer.txt"));
            while (fileScanner.hasNextLine()){
                arr[i]=fileScanner.nextLine();
                i++;
            }

        }

        catch (IOException x)
        {
            System.out.println("errer");  
        }

        caller();
    }

    void caller(){

        if (arr[0].equals("bin")&&arr[1].equals("bin"))
        {
            todec();
            operate();
            tobin();
            print();
        }

        else if(arr[0].equals("bin")&&arr[1].equals("dec"))
        {
            todec();
            operate();
            print();
        }

        else if(arr[0].equals("dec")&&arr[1].equals("dec"))
        {
            nu1=Integer.parseInt(n1);
            nu2=Integer.parseInt(n2);
            operate();
            print();
        }
        else if(arr[0].equals("dec")&&arr[1].equals("bin"))
        {
            nu1=Integer.parseInt(n1);
            nu2=Integer.parseInt(n2);
            operate();
            tobin();
            print();
        }
        else System.out.println("kk"); 
    }

    void todec()
    {

        int decimal = 0;
        int power = 0;
        int binary=Integer.parseInt(n1);
        while(true){
            if(binary == 0){
                break;
            } else {
                int tmp = binary%10;
                decimal += tmp*Math.pow(2, power);
                binary = binary/10;
                power++;
            }
        }
        nu1=decimal;
        decimal = 0;
        power = 0;
        binary=Integer.parseInt(n2);
        while(true){
            if(binary == 0){
                break;
            } else {
                int tmp = binary%10;
                decimal += tmp*Math.pow(2, power);
                binary = binary/10;
                power++;
            }
        }
        nu2=decimal;


        System.out.println(nu1+" "+nu2); 
    }

    void operate()
    {

        switch(op.charAt(0))
        {
        case '+' :
        { res=nu1+nu2;
        break;}
        case '-':
        { res=nu1-nu2;
        break;}
        case '/':
        { res=nu1/nu2;
        break;}
        case '*':
        { res=nu1*nu2;
        break;}
        default:
            System.out.println("Errorr"); 
        }
    }

    void tobin()
    {

        String temp="";
        i=res;
        while(i>0)
        {
            temp=(i%2)+temp;
            i=i/2;
        }
        temp=i+temp;
        res=Integer.parseInt(temp);
    }

    void print()
    {

        System.out.println(res);
        System.out.println("n for another operation");
        System.out.println("m to change the modes");
        System.out.println("e to exit");
        char c=sc.nextLine().charAt(0);
        switch (c) 
        {
        case 'n' :
        {
            askdata();
            break;
        }

        case 'm' :
        {
            askuser();
            break;
        }

        case 'e' :
        {
            System.out.println("Bye");
            break;
        }

        default: System.out.println("errreeer"); 
        }

    }
}

当我在第一次运行后选择更改模式时会抛出异常,所以有人可以帮我解决这个问题吗?

编辑:我认为我的问题与this one.重复,但我不知道这是怎么回事。我被困在一个程序之间,而这个问题只是解释了我得到的错误。我需要一个解决方案或可能的建议来使我的代码工作。

3 个答案:

答案 0 :(得分:1)

错误发生在askuser方法内的第58行,因为pw尚未初始化。

只有在pw方法中发生IOException时才会初始化main。但是,如果您没有收到异常,则无论如何都可以通过askuser方法使用print方法。此时,pw未初始化,这将导致NullPointerException

要解决此问题,请在pw方法的非错误情况下初始化bwmain

答案 1 :(得分:0)

fw=new FileWriter("lol.txt"); bw=new BufferedWriter(fw) pw=new PrintWriter(bw);

您已将此放入try-catch语句中。这意味着,除非您收到错误,否则您的PrintWriter pw不会被初始化。您之后调用pw.println(inpmode);由于未初始化pw,因此您将获得nullpointerexception。

答案 2 :(得分:-1)

你试过抓住它吗?

try { /* code part that throws exception */ } catch (NullPointerException e) { e.printStackTrace();}

StackTrace提供了有关您指向(引用)null值的位置和原因的非常有价值的信息。