“处理或申报。这是法律。” -先行
但是,这是一条好法律吗?我先举个例子:
public static void main(String[] args) throws Exception {
m1();
}
static void m1() throws Exception{
m2();
}
static void m2() throws Exception {
throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)
m2()
抛出异常并m1()
调用m2()
,这意味着它必须处理或声明它。嗯,让我们宣布吧。然后main()
调用m1()
,它有相同的 poll: declare或handle。我再次决定声明它并且代码编译得很好。
好的,它有效,但是谁处理了这个异常呢?好像没有人做过。我知道我是初学者,但我不喜欢那样的声音。是的,有些方法可以决定是声明还是处理异常,但为什么main()
呢?main 方法不应该是一个只处理的方法吗?那样的话,任何例外都不会“滑倒”。
我错过了什么吗?老实说,我很惊讶 main 方法可以只声明异常,因为知道这是我们在技术上可以捕获某些东西的最后一个地方。
我开始学习有关 JSTL 标签的教程。使用的存储库教程太旧了,所以我想使用一些较新的版本尝试我的方式。不幸的是,我现在被困住了。我会告诉你我做了什么,所以我希望你能帮助我。
我从这两个链接下载了2个jar文件:api,implementation。
我得到的 Jar 文件,我复制到了里面WebContent/Web-INF/lib
。现在,如果我这样做,我会收到错误:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<body>
<c:set var="varA" value="hello world" />
<%=varA %> //varA cannot be resolved to a variable
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
老实说,我不知道为什么当jar文件实际上在我的项目lib
文件夹中时我们需要 import 语句。另外,有谁知道这里出了什么问题以及为什么编辑器找不到我的变量varA?
来自这篇文章,它说:
\n\n\n当我们\n使用任何修改方法\xe2\x80\x93(例如add()或remove()\xe2\x80\x93)时,\nCopyOnWriteArrayList的整个内容都会被复制到新的\n内部副本中。
\n由于这个简单的事实,我们可以以安全的方式迭代列表,\n即使发生并发修改也是如此。
\n当我们在 CopyOnWriteArrayList 上调用 iterator() 方法时,我们会返回一个由 CopyOnWriteArrayList 内容的不可变快照备份的迭代器。
\n它的内容是创建迭代器时 ArrayList 内数据的精确副本。\n 即使与此同时,某个线程从列表中添加或删除元素,该修改也会创建数据的新副本,该副本将用于从该列表进行任何进一步的数据查找。
\n
接下来要问自己的简单问题是为什么两者都是?基本上,根据我的理解,写入操作是在新副本上进行的,而读取操作是在集合的克隆上完成的。
\n例如,如果在新副本上完成写入,则意味着我可以迭代“原始”集合 - 这意味着它不会受到影响。那么为什么要增加在另一个副本(快照)中存储元素的开销呢?或者相反的方向,如果我将元素存储在副本(快照)中,为什么当我实际上是在克隆而不是“原始”集合上迭代时需要在副本上进行写入(意味着快照永远不会改变)?
\n我希望这个问题是合法的,因为我确实检查了互联网上所有可能的来源,但没有一篇文章帮助我消除了这种困惑。我在这里缺少什么?
\nThread
class 有许多按类名调用的静态方法。他们之中有一些是:
但是,我们提供了currentThread()
返回当前正在执行的线程对象的方法。一些是:
不幸的是,这在我的脑海中造成了混乱。当我想到我想要的方法时,我不知道我会发现它是static还是instance。那么他们为什么要采用这两种方法呢?
我的意思是,他们不能都归为同一个“呼叫”吗?例如,为什么使用sleep()
静态而不是实例方法调用Thread.currentThread().sleep()
?另一个奇怪的例子是在不同的方式之间interrupted()
和isInterrupted()
定义的。他们做完全一样的事情,只是interrupted()
另外清除了中断标志。有没有人对此有逻辑回答,所以我毫不费力地在哪里找到每种方法?
同步方法是可重入的吗?
我有这个代码:
public class Main {
synchronized void m1() {
//some code
m2();
//some code
}
synchronized void m2(){
//some code
}
}
Run Code Online (Sandbox Code Playgroud)
m1()
假设两个线程(线程 A 和线程 B)尝试同时访问。线程 A首先获取锁。一段时间后,线程 A调用m2()
,它也在同一个对象上同步。
因为我不想做任何猜测,有人可以告诉我:当线程 A调用时,是否能保证会发生什么m2()
?我的意思是,一旦线程 A调用m2()
,它是否会“离开锁定”?因为从技术上讲它离开了方法的框架,那么它也会离开锁吗?
[编辑]:线程 Am2()
每次调用它后都会运行吗?或者它是否留下锁,以便线程 A和线程 B都可以争夺它们的目标?
假设我尝试运行这段代码:
FileWriter fw = new FileWriter("a.txt");
fw.write("A");
Run Code Online (Sandbox Code Playgroud)
它不会工作,因为数据被缓冲,并且在达到最大缓冲区大小之前不会自动刷新。所以我们用 手动刷新fw.flush();
,之后就可以了。
然后我想从同一个文件中读取数据。我这样做并且效果很好:
FileReader fr = new FileReader ("a.txt");
System.out.println (fr.read ());
OUTPUT: 65
Run Code Online (Sandbox Code Playgroud)
有人能告诉我为什么没有方法flush()
吗fileReader
?我的意思是它不应该起到相反的作用吗fileWriter
?在这种情况下,数据将在读取之前进行缓冲,而不是在发送到源之前缓冲数据。我担心我错过了一些基本的东西,有人可以指出吗?
这两个行会我写字母A的file
。有人能告诉我他们在内部工作上有什么不同吗?
FileOutputStream fileOutputStream = new FileOutputStream("test.txt");
fileOutputStream.write(65);
fileOutputStream.write('A');
Run Code Online (Sandbox Code Playgroud)
[编辑]:我对转换在这两种情况下的工作方式更感兴趣。据我所知,ASCII 和 UNICODE 表是什么。
我想从方法 currentThread() 的 doc 开始:
- 返回对当前正在执行的线程对象的引用。
- @return 当前正在执行的线程。
现在知道这一点,这是有道理的方法,如join()
,isAlive()
,getName()
,isInterrupted()
等被称为像这样,例如Thread.currentThread().join
。
我的问题是我们如何不需要currentThread
前缀调用方法,例如sleep()
,yield()
,interrupted()
等?例如,当没有实例时,静态调用如何Thread.sleep()
确切知道我们“针对”哪个线程实例?
java ×7
buffer ×1
bytestream ×1
clone ×1
exception ×1
file-writing ×1
filereader ×1
filewriter ×1
io ×1
iterator ×1
java-io ×1
java-threads ×1
jsp ×1
jstl ×1
locking ×1
methods ×1
reentrancy ×1
scriptlet ×1
throws ×1