小编Ste*_*fan的帖子

为什么允许 main() 方法声明异常?

“处理或申报。这是法律。” -先行

但是,这是一条好法律吗?我先举个例子:

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: declarehandle。我再次决定声明它并且代码编译得很好。

好的,它有效,但是谁处理了这个异常呢?好像没有人做过。我知道我是初学者,但我不喜欢那样的声音。是的,有些方法可以决定是声明还是处理异常,但为什么main()呢?main 方法不应该是一个只处理的方法吗?那样的话,任何例外都不会“滑倒”。

我错过了什么吗?老实说,我很惊讶 main 方法可以只声明异常,因为知道这是我们在技术上可以捕获某些东西的最后一个地方

java exception throws

5
推荐指数
1
解决办法
155
查看次数

如何在 <%= scriptlet %> 中访问 <c:set var>

我开始学习有关 JSTL 标签的教程。使用的存储库教程太旧了,所以我想使用一些较新的版本尝试我的方式。不幸的是,我现在被困住了。我会告诉你我做了什么,所以我希望你能帮助我。

我从这两个链接下载了2个jar文件:apiimplementation

我得到的 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

jsp jstl scriptlet

4
推荐指数
1
解决办法
8315
查看次数

为什么 CopyOnWriteArrayList 的写入和读取操作都需要副本?

来自这篇文章,它说:

\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

例如,如果在新副本上完成写入,则意味着我可以迭代“原始”集合 - 这意味着它不会受到影响。那么为什么要增加在另一个副本(快照)中存储元素的开销呢?或者相反的方向,如果我将元素存储在副本(快照)中,为什么当我实际上是在克隆而不是“原始”集合上迭代时需要在副本上进行写入(意味着快照永远不会改变)?

\n

我希望这个问题是合法的,因为我确实检查了互联网上所有可能的来源,但没有一篇文章帮助我消除了这种困惑。我在这里缺少什么?

\n

java iterator clone copyonwritearraylist java-failsafe

3
推荐指数
1
解决办法
825
查看次数

当我们有 currentThread() 方法时,为什么 Thread 类有静态方法?

Threadclass 有许多按类名调用的静态方法。他们之中有一些是: 在此处输入图片说明

但是,我们提供了currentThread()返回当前正在执行的线程对象的方法。一些是: 在此处输入图片说明

不幸的是,这在我的脑海中造成了混乱。当我想到我想要的方法时,我不知道我会发现它是static还是instance。那么他们为什么要采用这两种方法呢?

我的意思是,他们不能都归为同一个“呼叫”吗?例如,为什么使用sleep() 静态而不是实例方法调用Thread.currentThread().sleep()?另一个奇怪的例子是在不同的方式之间interrupted()isInterrupted()定义的。他们做完全一样的事情,只是interrupted()另外清除了中断标志。有没有人对此有逻辑回答,所以我毫不费力地在哪里找到每种方法?

java methods multithreading java-threads

2
推荐指数
1
解决办法
115
查看次数

同步方法中的重入

同步方法是可重入的吗

我有这个代码:

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都可以争夺它们的目标?

java multithreading locking reentrancy

2
推荐指数
1
解决办法
96
查看次数

为什么FileReader没有flush,而FileWriter有呢?

假设我尝试运行这段代码:

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?在这种情况下,数据将在读取之前进行缓冲,而不是在发送到源之前缓冲数据。我担心我错过了一些基本的东西,有人可以指出吗?

java io buffer filereader filewriter

2
推荐指数
1
解决办法
362
查看次数

字节流的内部工作。write(65) 和 write('A') 的区别?

这两个行会我写字母Afile。有人能告诉我他们在内部工作上有什么不同吗?

FileOutputStream fileOutputStream = new FileOutputStream("test.txt");
fileOutputStream.write(65);
fileOutputStream.write('A');
Run Code Online (Sandbox Code Playgroud)

[编辑]:我对转换在这两种情况下的工作方式更感兴趣。据我所知,ASCII 和 UNICODE 表是什么。

java file-writing java-io bytestream

1
推荐指数
1
解决办法
77
查看次数

来自 Thread 类的方法和与 Thread.currentThread() 一起使用的方法之间的区别?

我想从方法 currentThread() 的 doc 开始:

  • 返回对当前正在执行的线程对象的引用。
  • @return 当前正在执行的线程。

现在知道这一点,这是有道理的方法,如join()isAlive()getName()isInterrupted()等被称为像这样,例如Thread.currentThread().join

我的问题是我们如何不需要currentThread 前缀调用方法,例如sleep()yield()interrupted()等?例如,当没有实例时,静态调用如何Thread.sleep()确切知道我们“针对”哪个线程实例

java multithreading

1
推荐指数
1
解决办法
62
查看次数