我在尝试编写两种方法时遇到了一些麻烦.两者都涉及使用扫描仪读取文件,其中每行以逗号分隔.这些方法是我的FileIO类的一部分.除了那个类,我还有另外两个类,Food和FoodArrayList.食品包含食品捐赠的几条信息(捐赠物品的人,捐赠的原因等).FoodArrayList类几乎具有与ArrayList相同的功能,除了我创建它只是为了存储Food对象.
我正在努力解决的两种方法如下:
我正在努力的是我在两种方法中都关闭了扫描仪.而且我一直在努力研究如何编写一个if语句来检测扫描仪是否已关闭.在这两种方法中,我在方法的最开头有以下内容:
try{
if(scan.hasNext() == false || scan == null)
scan = new Scanner(new File(this.getFileName()));
}
catch(FileNotFoundException fnfe){
System.err.println("The " + fileName + " could not be found.");
}
catch(IOException ioe){
ioe.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用.如果我首先使用方法#1然后再尝试使用方法#2(请记住我在每个方法结束时关闭扫描程序),该if语句将被跳过并且scan永远不会重新实例化并且我会被抛出IllegalStateException.
我之前应该提到的一个非常重要的一点是:我希望这两种方法都可以重用.如果方法#1一直持续到文件结束,我稍后再使用方法#2,我希望Scanner对象再次从文件的开头读取.似乎唯一的方法是重新实例化Scanner对象.
当我第一次了解Java中的I/O时,我记得当你完成使用它们时,总是要确保关闭Scanner对象.这几乎已经根深蒂固地融入了我的大脑.无论如何,我该如何解决这个问题?我有一个想法是scan在我的两个方法结束时设置为null.这甚至是必要的吗?我已经阅读了StackOverflow中的其他帖子,这些帖子会导致我甚至没有关闭我的Scanner对象,只是让垃圾收集器处理它.
除了所有这一切之外,我还想知道一旦扫描仪关闭后究竟发生了什么,以及为什么它不能重新打开.我知道它与Streams有关,但我不确切知道它们在Java的上下文中是什么.我尝试查找Stream类,但无法从中获得很多理解.
以下是我的两种方法的代码:
方法#1
public int numberOfLines(){
try{
if(scan.hasNext() == false || scan == null)
scan = new Scanner(new File(this.getFileName()));
}
catch(FileNotFoundException fnfe){
System.err.println("The " + fileName …Run Code Online (Sandbox Code Playgroud) 我试图在一个类中定义一个枚举,但是Eclipse继续用可爱的红色突出显示我的代码。这大部分是我的代码:
package campusvilleFoodBank;
import java.util.NoSuchElementException;
import java.util.Scanner;
public class FoodArrayList {
public enum Days {SUN, MON, TUE, WED, THUR, FRI, SAT}
private Food [] foodArray;
private int iterator;
private boolean startIndexing;
private static final int MAX = 24;
public FoodArrayList(){
foodArray = new Food [MAX];
iterator = 0;
}
public FoodArrayList(int arraySize){
foodArray = new Food [arraySize];
iterator = 0;
}
//Rest of code, with more complicated methods here
}
Run Code Online (Sandbox Code Playgroud)
我必须缺少一些非常简单的东西,这很可能是语法错误。...下面的代码涉及诸如my之类的toString()方法,一些foodArray实例变量的排序方法以及类似的内容。我没有定义主要方法。我知道我可以在类定义中定义一个枚举,并且在其他地方看到的所有代码几乎都与我所拥有的代码完全相同。但是,Eclipse似乎甚至都不能识别该enum声明,并且我认为我不需要导入任何东西。
这是我在Eclipse中遇到错误的代码的内容:
为了进行比较,下面是来自另一个单独的.java文件的一些枚举代码,这些文件似乎没有错误:
任何帮助,将不胜感激。让我知道是否需要进一步澄清。
我一直在通过这个Codelab 来了解协程。我仍然不清楚的一件事是,为什么我们需要更改调度程序以确保我们不会阻塞主/UI 线程?如果协程是轻量级线程,那么当我已经在主线程上时,为什么我不能在协程中调用线程阻塞函数(无论它们是否挂起)?
Codelab 解释说(总而言之)如果我编写此代码:
// Repository.kt
suspend fun repoRefreshTitle() {
delay(500)
}
//ViewModel.kt
fun vmRefreshTitle() {
viewModelScope.launch {
_spinner.value = true
repository.repoRefreshTitle()
}
}
Run Code Online (Sandbox Code Playgroud)
...那么这不会阻塞主线程。delay()是一个suspend函数,因此创建的协程viewmodelScope.launch将暂停,直到 500ms 过去。但主线程不会被阻塞。
但是,如果我重构repoRefreshTitle()为以下内容:
suspend fun repoRefreshTitle() {
val result = nonSuspendingNetworkCall()
}
Run Code Online (Sandbox Code Playgroud)
...然后该网络调用实际上将在主线程上完成。那是对的吗?我必须更改为另一个调度程序才能将工作卸载到 IO 线程:
suspend fun repoRefreshTitle() {
withContext(Dispatchers.IO) {
val result = nonSuspendingNetworkCall()
}
}
Run Code Online (Sandbox Code Playgroud)
我一定是把这个问题过于简单化了。我已经处于协程中还不够吗?为什么我必须更换调度员?
我很难理解如何在VBA中的String中放置双引号(").我知道我可以使用该char(34)函数轻松完成此操作.我也明白另一种方法是使用4个双引号:"""".所有这一切都从以前的一个SO帖子:
但是,我的问题是......为什么需要4个引号?前两个是逃避,第三个是引用本身,第四个是终止引用吗?或者它以不同的方式工作?关于VBA如何处理这些双引号,我无法找到具体的答案.
我还注意到,如果我尝试在String中添加或删除双引号的数量,Visual Studio将动态添加或删除双引号.例如,我最初有以下字符串:
data = TGName + """ + iterator.Value + """
Run Code Online (Sandbox Code Playgroud)
...在消息框中生成以下内容:
但是,如果我尝试将String(+ """)末尾的第二组双引号从3调整为4,Visual Studio会自动将其调整为5.我最后只能有4个引号.这是消息框中的结果字符串:
消息框中的字符串不是我希望拥有的实际输出,它们纯粹是出于实验目的.但是,我注意到的是,显然需要VBA中String中允许的引号数.有谁知道这个要求是什么?为什么IDE强制在第二个String中插入额外的引用?有人可以解释我所描述的两种情况下实际字符串内容和格式引号之间的差异吗?
一如既往,对此的任何帮助将不胜感激:)