【问题标题】:Hashmap get() Null Pointer Exception [duplicate]Hashmap get() 空指针异常 [重复]
【发布时间】:2016-09-06 14:25:04
【问题描述】:

项目是编码解码: abcdefghijklmnopqrstuvwxyz kngcadsxbvfhjtiumylzqropwe 首先,程序应该要求用户输入上面的密钥字符串。 然后程序将读取文件并将其编码内容输出到控制台。大写字母的映射方式与上面的小写字母相同,但保持大写。例如,使用上面的键,每个“A”都变成了“K” ' 编码文本时。数字和其他字符未编码并保持不变。 例如,使用上面的映射,在对文本进行编码时,每个 'a' 都变成了 'k',并且每个 解码时'k'变成'a'。

运行 1: 输入编码密钥:maxnrslkbpwfzjidouetchgvyq 输入文件名:sampleInput.txt ************** 编码内容 ************** Grfxizr ti XE 20A! Xizdctrue mur liin mt siffigbjl bjetucxtbije,行为 jit mt urmnbjl yicu zbjn。 bs yic mctizmtr m zree, yic lrt mj mctizmtrn zree。


再见!

我收到错误:Exception in thread "main" java.lang.NullPointerException

在线char outputFile= hmap.get(FileChar); C:\Users.....\AppData\Local\NetBeans\Cache\8.1\executor-sn-ps\run.xml:53:Java 返回:1

我想将输入文件分配给哈希映射获取值。

是不是因为我没有对hashmap中除了[a-z]之外的其他字符做key值,比如“,!”等,那么它没有这个key值然后抛出null异常?

这是code 的一些hashmap

HashMap<Character,Character>hmap = new HashMap<>();
  for(int j =0; j<26; j++){

      if(Character.isUpperCase(originalResult.charAt(j))){     
          hmap.put(originalResult.charAt(j),Character.toUpperCase(inputResult.charAt(j)));
      }
      else{
      hmap.put(originalResult.charAt(j),inputResult.charAt(j));
      }
  }

这是我认为问题所在的一些代码:

while((Fileline =bin.readLine())!=null )
{
    char[] FileArray = Fileline.toCharArray();

    for(int j=0;j<Fileline.length();j++ )
    {
        FileChar =FileArray[j];  
        char outputFile= hmap.get(FileChar);   ////here is the problem   
    }

    System.out.println( String.valueOf(outputFile));
}

我认为问题可能是我打印时的字符:

while((Fileline =bin.readLine())!=null ){

    char[] FileArray = Fileline.toCharArray();

   for(int j=0;j<Fileline.length();j++ ){
          FileChar =FileArray[j]; 
          s = new String(String.valueOf(FileChar));

  }
   System.out.println(s);

结果什么都没有:

是的

.

但是当我在循环中打印时,它看起来每一行只有一个字母,而且很多行:

while((Fileline =bin.readLine())!=null ){

    char[] FileArray = Fileline.toCharArray();

   for(int j=0;j<Fileline.length();j++ ){
          FileChar =FileArray[j]; 
          s = new String(String.valueOf(FileChar));
         System.out.println(s);
  }

【问题讨论】:

  • 对变量和方法使用Java中的驼峰式大小写(fileChar而不是FileChar),看起来FileChar是对静态类的引用。如果是这样,那就是问题的开始。
  • 我已将第一个字母的大写改为小写,我认为问题可能出在 valueof(char) 上?我不确定,我不知道如何解决
  • 发布完整的堆栈跟踪(错误),而不仅仅是指针异常
  • Main.main(Main.java:140) C:\Users\.......\AppData\Local\NetBeans\Cache 处的线程“main”java.lang.NullPointerException 中的异常\8.1\executor-sn-ps\run.xml:53:Java 返回:1 这是 构建失败(总时间:7 秒)

标签: java exception null hashmap char


【解决方案1】:

没有输出的原因(只有文件的最后一个字符)是因为每次调用时都在重新实例化一个新字符串:

s = new String(String.valueOf(FileChar));

试试这个:

    char[] FileArray = Fileline.toCharArray();
    s = "";
       for(int j=0;j<Fileline.length();j++ ){
              FileChar =FileArray[j]; 
              s = s + String.ValueOf(FileChar);   
      }
  System.out.println(s);

同样的东西,但更干净:

      char[] FileArray = Fileline.toCharArray();
    s = "";
       for(int j=0;j<Fileline.length();j++ ){
              s += String.ValueOf(FileArray[j]); 
      }
  System.out.println(s);

最后:

    while((Fileline =bin.readLine())!=null ){

        char[] FileArray = Fileline.toCharArray();
        s = "";
        for(int j=0;j<Fileline.length();j++ ){
              s += String.ValueOf(FileArray[j]);
        }
        System.out.println(s);
}

您得到空指针异常,因为hmap 没有您尝试“获取”的每个字符的值。如果您没有为键“a”设置值,则不能期望获得键“a”的值;例如,如果我这样做:

hmap.put('a', 'd');

hmapt.get('z');

将返回空指针异常,因为键“z”的值不存在,仅适用于“d”的“a”。

如果您根本不编译,那是因为您没有在运行“.get(FileChar)”的范围内初始化一些变量“hmap”或“FileChar”。

【讨论】:

  • 是的,你是对的,如果我改为 s += String.ValueOf(FileArray[j]) , char 工作正常。但是,我这样做只是为了检查 hashmap get() 和 char outputFile= hmap.get(fileChar);这里有问题:线程“main”中的异常 java.lang.NullPointerException
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2014-02-04
  • 2014-07-28
  • 2016-04-28
相关资源
最近更新 更多