英文:
My classes are conflicting with each other and I dont know why
问题
所以我现在正在学习Java,并且我正在使用类似于C中的“子程序”,但出现了一个问题,当我同时使用这两个程序时,它会给我一个错误:“主线程中的异常java.util.NoSuchElementException”
主程序:
public static void main(String[] args) {
System.out.println("请输入一个字符串:");
String s = SubProgram.string();
System.out.println("字符串:" + s);
System.out.println("请输入一个整数:");
int i = SubProgram.umInt();
System.out.println("整数:" + i);
}
}
类:
public class SubProgram {
public static String string() {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
scan.close();
return s;
}
public static int umInt(){
Scanner scan2 = new Scanner(System.in);
int num = scan2.nextInt();
scan2.close();
return num;
}
}
如果我注释掉所有的“String”类,那么整数部分可以正常工作。如果我不注释掉“String”部分,那么字符串可以正常工作,但整数部分无法正常工作。
英文:
So I'm learning java right now and I'm using "sub-programs" just like in C but for some reason when I have both programs it gives me an error "Exception in thread "main" java.util.NoSuchElementException"
Main:
public static void main(String[] args) {
System.out.println("Escreva uma string:");
String s = SubProgram.string();
System.out.println("The string " +s);
System.out.println("Escreva um Int:");
int i = SubProgram.umInt();
System.out.println("The int: " +i);
}
}
Classes:
public class SubProgram {
public static String string() {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
scan.close();
return s;
}
public static int umInt(){
Scanner scan2 = new Scanner(System.in);
int num = scan2.nextInt();
scan2.close();
return num;
}
}
If I comment all the "String" class the int one works fine. If I don't comment the String, the String works fine but the int does not
答案1
得分: 1
首先,让我们澄清一些术语:实际上,无论是C还是Java,都没有使用"子程序"这个术语,但如果您不是英语母语人士,在翻译时犯这个错误是可以理解的。
您的程序中有一个类 - SubProgram
,它有两个"方法" - string
和 umInt
。
这些名称不太好,因为它们与数据类型太相似。
最好使用诸如getString
和getInt
之类的方法名称。
但真正的问题是您关闭了System.in
。
就像C中的stdin
一样,Java中的System.in
是表示程序标准输入的文件。
Java有几个用于更方便地处理文件的"包装器"类,其中之一就是Scanner
。
但是,如果关闭了包装文件的Scanner
,也将关闭文件。
请注意,Scanner
不仅会在显式调用close
时关闭,而且如果超出范围,它也会关闭 - 这意味着如果您在方法中创建了Scanner
对象,就像您现在所做的那样,一旦退出方法,Scanner
将会自动关闭。
这是Java与C不同的地方:对许多事物都有自动的"清理"!
解决问题的一种方法是将Scanner
转换为类的静态成员,如下所示:
public class SubProgram {
private static final Scanner INPUT = new Scanner(System.in);
public static String string() {
String s = INPUT.nextLine();
return s;
}
public static int umInt(){
int num = INPUT.nextInt();
return num;
}
}
我添加了final
修饰符,类似于C中的const
。
由于您希望在程序运行时不更改此Scanner
,最好将其保存为常量。
此外,在Java中,使用大写字母表示常量名称是习惯做法(虽然语言不要求)。
- 一个小注:出于简单起见,我使用了"文件"这个术语,但实际上,
System.in
实际上是一个"流"(类型为InputStream
的对象)。流是Java处理诸如文件和套接字等可以读写的东西的方式,但目前您可以将其视为类似于C中捆绑有相关函数(如fopen
)的FILE *
。
英文:
First, lets clarify some terms: neither C nor Java actually use the term "sub program", but if you are not a native English speaker this is an understandable error in translation.
What you have in your program is one class - SubProgram
that has 2 "methods" - string
and umInt
.
These names are not very good, since they are too similar to data types.
It would be preferable to use method names like getString
and getInt
.
But the real problem is that you are closing System.in
.
Just like stdin
in C, System.in
in Java is a file representing the standard input of your program.
Java has several "wrapper" classes to make working with files more convenient, and Scanner
is one of them.
However, if you close the Scanner
wrapping the file, you will also close the file.
Note, that Scanner
will close not only if you explicitly call close
, but also if it goes out of scope - this means if you created the Scanner
object in a method, like you do now, once you exit the method the Scanner
will close automatically.
This is the part where Java is different from C: there is automatic "cleanup" for a lot of things!
One way to solve your problem is to turn Scanner
in to a static memeber of the class, like this:
public class SubProgram {
private static final Scanner INPUT = new Scanner(System.in);
public static String string() {
String s = INPUT.nextLine();
return s;
}
public static int umInt(){
int num = INPUT.nextInt();
return num;
}
}
I added the final
modifier which is similar to const
in C.
Since you don't want to change this Scanner
as long as your program is running, it is better to hold it in a constant.
Also, it is customary to use UPPERCASE for constant names in Java (though it is not required by the language).
- One small note: I used the term "file" for simplicity, but
System.in
is actually a "stream" (object of typeInputStream
). Streams is how Java deals with things you can read and write like files and sockets, but for now you can think of it as being similar toFILE *
in C bundled with relevant functions likefopen
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论