Java 扫描程序在尝试获取下一个时抛出空指针
为奇怪的格式道歉,这是我的第一篇文章。getone()方法中正在引发null指针异常。首先是hasNext(),如果我删除了它,就在next()。为奇怪的格式道歉,这是我的第一篇文章。getone()方法中正在引发null指针异常。首先在hasNext(),如果我删除它,在next()。您是所谓变量阴影的受害者。 用线Java 扫描程序在尝试获取下一个时抛出空指针,java,Java,为奇怪的格式道歉,这是我的第一篇文章。getone()方法中正在引发null指针异常。首先是hasNext(),如果我删除了它,就在next()。为奇怪的格式道歉,这是我的第一篇文章。getone()方法中正在引发null指针异常。首先在hasNext(),如果我删除它,在next()。您是所谓变量阴影的受害者。 用线 public class ScannerTest { protected Scanner scan; public ScannerTest(String s)
public class ScannerTest {
protected Scanner scan;
public ScannerTest(String s) {
Scanner scan = new Scanner(s);
}
public void getone() {
if (scan.hasNext()) {
String temp = scan.next();
temp = temp.replaceAll("[\\[\\](){}]", "");
System.out.println(temp);
}
}
public static void main(String[] args) {
String s = "(abcd) (defg) (w)";
ScannerTest test = new ScannerTest(s);
Scanner rando = new Scanner(s);
System.out.println(rando.next());
System.out.println(rando.hasNext());
test.getone();
}
}
您正在声明局部变量扫描,而不是在ScannerTest类中初始化成员扫描。将提及的行更改为
Scanner scan = new Scanner(s);
它将按预期工作
完整的源代码
scan = new Scanner(s);
你是所谓可变阴影的受害者。 用线
public class ScannerTest {
protected Scanner scan;
public ScannerTest(String s) {
Scanner scan = new Scanner(s);
}
public void getone() {
if (scan.hasNext()) {
String temp = scan.next();
temp = temp.replaceAll("[\\[\\](){}]", "");
System.out.println(temp);
}
}
public static void main(String[] args) {
String s = "(abcd) (defg) (w)";
ScannerTest test = new ScannerTest(s);
Scanner rando = new Scanner(s);
System.out.println(rando.next());
System.out.println(rando.hasNext());
test.getone();
}
}
您正在声明局部变量扫描,而不是在ScannerTest类中初始化成员扫描。将提及的行更改为
Scanner scan = new Scanner(s);
它将按预期工作
完整的源代码
scan = new Scanner(s);
替换
import java.util.Scanner;
public class SomeClass {
protected Scanner scan;
public SomeClass(String s) {
scan = new Scanner(s);
}
public void getone() {
if (scan.hasNext()){
String temp = scan.next();
temp = temp.replaceAll("[\\[\\](){}]","");
System.out.println(temp);
}
}
public static void main(String[] args) {
String s = "(abcd) (defg) (w)";
SomeClass test = new SomeClass(s);
Scanner rando = new Scanner(s);
System.out.println(rando.next());
System.out.println(rando.hasNext());
test.getone();
}
}
与
这样就可以将newscanner
分配给实例变量scan
。语句Scanner scan=newscanner构造函数内部的code>正在创建一个扫描
引用,其范围仅限于构造函数本身
此校正后的输出:
public ScannerTest(String s) {
scan = new Scanner(s);
}
替换
import java.util.Scanner;
public class SomeClass {
protected Scanner scan;
public SomeClass(String s) {
scan = new Scanner(s);
}
public void getone() {
if (scan.hasNext()){
String temp = scan.next();
temp = temp.replaceAll("[\\[\\](){}]","");
System.out.println(temp);
}
}
public static void main(String[] args) {
String s = "(abcd) (defg) (w)";
SomeClass test = new SomeClass(s);
Scanner rando = new Scanner(s);
System.out.println(rando.next());
System.out.println(rando.hasNext());
test.getone();
}
}
与
这样就可以将newscanner
分配给实例变量scan
。语句Scanner scan=newscanner构造函数内部的code>正在创建一个扫描
引用,其范围仅限于构造函数本身
此校正后的输出:
public ScannerTest(String s) {
scan = new Scanner(s);
}
您正在将Scanner声明为构造函数中的局部变量。因为它也有名称“scan”,所以它隐藏了字段(类级别变量),也被命名为scan。要解决这个问题,在构造器内部,只需移除扫描器部分,并保留:scan=新扫描器;您正在将Scanner声明为构造函数中的局部变量。因为它也有名称“scan”,所以它隐藏了字段(类级别变量),也被命名为scan。要解决这个问题,在构造器内部,只需移除扫描器部分,并保留:scan=新扫描器;