Questions tagged «java»

Java是最初由Sun Microsystems开发的高级,独立于平台的,面向对象的编程语言。Java目前归甲骨文所有,甲骨文于2010年收购了Sun。

2
是否可以在Java中捕获StackOverflowError?
我曾经以为不是,但是昨天我不得不这样做。这是一个使用Akka(JVM的参与者系统实现)来处理异步作业的应用程序。其中一位参与者执行了一些PDF操作,并且由于该库存在错误,因此有时会死于StackOverflowError。 第二个方面是,如果捕获到任何JVM致命错误(例如,StackOverflowError),则将Akka配置为关闭其整个actor系统。 第三个方面是该参与者系统被嵌入到Web应用程序中(出于WTF-ish,传统,原因),因此当参与者系统关闭时,Web应用程序就不会被关闭。最终结果是,在StackOverflowError我们的工作处理应用程序上,该应用程序变成了一个空的Web应用程序。 作为快速解决方案,我不得不赶上了StackOverflowError被抛出的问题,以便不会破坏actor系统的线程池。这使我认为也许有时可以捕获此类错误,尤其是在这种情况下?当有一个线程池处理任意任务时?与A不同,OutOfMemoryError我无法想象A如何StackOverflowError使应用程序处于不一致状态。在发生此类错误后将清除堆栈,因此计算可以正常进行。但是也许我错过了一些重要的事情。 另外,请注意,我一开始就是要修复错误(事实上,几天前我已经在同一应用程序中修复了SOE),但是我真的不知道什么时候可能会出现这种情况。 为什么最好重新启动JVM进程而不是捕获StackOverflowError,将作业标记为失败,然后继续我的业务? 有什么令人信服的理由永远不赶上国有企业?除了“最佳实践”,这是一个模糊的术语,什么也没告诉我。

5
使用Python进行编程是否比使用C,C ++或Java更快?[关闭]
程序员之间普遍认为,语言越动态和松散地键入,它将使程序员的工作效率越高。Guido van Rossum于1998年撰写了有关使用python进行编程提高生产力的文章,并在网上搜索时,我仍然看到人们引用了这个确切的说法: 从语法上讲,Python代码看起来像可执行的伪代码。使用Python进行程序开发比使用C / C ++快5-10倍,比使用Java快3-5倍。在许多情况下,可以使用Python编写应用程序的原型,而无需编写任何C / C ++ / Java代码。通常,原型具有足够的功能,并且性能足以作为最终产品交付,从而节省了可观的开发时间。在其他时候,原型可以部分或全部转换为C ++或Java-Python的面向对象特性使转换成为一个简单的过程。 这个问题是否经过科学评估?如果不适合python,那么也许适合同级脚本语言(如ruby,perl或php)? 我不是在寻找合理化,类比或解释的理由,否则可能很难回答,除非研究人员或专家的意见花了一些时间来研究这个问题。 我最初是在skeptics.SE上提出这个问题的,有人建议我也在这里提出这个问题。

5
我想开始使用TDD。对初学者有什么提示吗?[关闭]
我从未在任何项目中使用过自动测试机制,但我感觉自己很想念。我想提高自己,所以我必须开始解决一些我一直这样忽略的问题,并尝试使用Git而不是坚持使用SVN。 学习TDD的好方法是什么?我可能会使用Eclipse在Java中进行编程。我听说过JUnit,但是我不知道还有什么我应该考虑的。

7
有什么实际的方法可以使链接的节点结构不可变?
我决定编写一个单链接列表,并制定了使内部链接节点结构不可变的计划。 不过我遇到了障碍。说我有以下链接的节点(来自先前的add操作): 1 -> 2 -> 3 -> 4 并说我想附加一个5。 为此,由于node 4是不可变的,因此我需要创建的新副本4,但将其next字段替换为包含的新节点5。现在的问题是3参考旧的4;没有附加的5。现在,我需要复制3,并替换其next字段以引用4副本,但是现在2引用的是旧版本3... 换句话说,要执行追加操作,似乎需要复制整个列表。 我的问题: 我的想法正确吗?有什么办法可以执行追加操作而不复制整个结构? 显然,“有效Java”包含以下建议: 类应该是不可变的,除非有充分的理由使它们可变。 这是变异性的好例子吗? 我认为这不是建议答案的重复,因为我不是在谈论清单本身。显然,它必须是可变的才能符合该接口(无需执行诸如在内部保留新列表并通过getter检索它的操作。不过,经过深思熟虑,即使这样也需要进行一些修改;将其保持在最低限度)。我说的是列表的内部是否必须不可变。


2
如何调试JSP?
我正在尝试为项目编辑JSP,并且在从服务器请求JSP时,我在NSP的某个位置获取了NullPointerException。 我的Web服务器(JBoss)报告了异常,但它给了我一个虚假的行号。据报告,异常发生在第702行,但是我的JSP只有146行长,因此我无法确定哪个行阻塞了。 有什么好的技术可以调试JSP中的错误?我正在使用IntelliJ 9 Ultimate作为我的IDE。 谢谢
26 java  ide  debugging  jsp  intellij 

4
为什么C ++和Java都使用“引用”概念,但含义却不同?
在C ++中,对函数的引用参数允许函数使引用引用其他内容: int replacement = 23; void changeNumberReference(int& reference) { reference = replacement; } int main() { int i = 1; std::cout << "i=" << i << "\n"; // i = 1; changeNumberReference(i); std::cout << "i=" << i << "\n"; // i = 23; } 类似地,如果我们尝试更改引用,则对函数的常量引用自变量将引发编译时错误: void changeNumberReference(const int& reference) …
26 java  c++  pointers  reference 

6
Java为什么将软件包访问设置为默认访问?
我之所以问这个问题,是因为我相信他们这样做是有充分的理由的,而且根据我到目前为止的行业经验,大多数人都没有正确使用它。但是,如果我的理论是正确的,那么我不确定为什么它们包含私有访问修饰符...? 我相信,如果正确使用默认访问权限,则可以在保持封装的同时增强可测试性。并且这也使私有访问修饰符变得多余。 通过将唯一的包用于需要隐藏在世界其他地方的方法,可以使用默认访问修饰符来提供相同的效果,并且在不影响可测试性的情况下做到这一点,因为测试文件夹中的包具有相同的功能。能够访问源文件夹中声明的所有默认方法。 我相信这就是Java将包访问权限用作“默认”的原因。但我不确定为什么它们还包括私有访问权,我确定有一个有效的用例...

5
一个实例可以等于某个更特定类型的其他实例吗?
我读过这篇文章:如何用Java编写平等方法。 基本上,它为支持继承的equals()方法提供了一种解决方案: Point2D twoD = new Point2D(10, 20); Point3D threeD = new Point3D(10, 20, 50); twoD.equals(threeD); // true threeD.equals(twoD); // true 但这是个好主意吗?这两个实例看起来是相等的,但可能具有两个不同的哈希码。是不是有点不对劲? 我相信这可以通过改用操作数来更好地实现。
25 java  c#  scala  comparison 

2
Java:为什么集合会接受比较器而不接受(假设的)Hasher和Equator?
当您使用接口的不同实现时,此问题最明显,并且出于特定集合的目的,您仅关心对象的接口级视图。例如,假设您有一个像这样的接口: public interface Person { int getId(); } 实现hashcode()和equals()实现类的通常方法在equals方法中将具有如下代码: if (getClass() != other.getClass()) { return false; } 这会导致问题,当你混的实现Person中HashMap。如果HashMap仅关心的接口级视图Person,则最终可能会出现仅在实现类上有所不同的重复项。 您可以通过equals()对所有实现使用相同的Liberty 方法来使这种情况起作用,但是您冒着equals()在不同上下文中做错事的风险(例如,比较Person数据库记录支持的两个带有版本号的)。 我的直觉告诉我,应该对每个集合而不是对每个类定义相等性。当使用依赖于排序的集合时,可以使用自定义Comparator在每个上下文中选择正确的排序。基于散列的集合没有类似物。为什么是这样? 为了澄清起见,此问题与“ 为什么.compalsTo()在接口中而.equals()在Java类中? ”不同,因为它处理集合的实现。compareTo()和equals()/ 和/ hashcode()都存在使用集合时的通用性问题:您不能为不同的集合选择不同的比较函数。因此,出于这个问题的目的,对象的继承层次结构根本无关紧要;重要的是比较函数是按对象定义还是按集合定义。
25 java  collections 

5
用共享的编码范例就好像用语言Y编写程序一样,用语言X编写内容为什么不好?
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 不久前,我在SO上问了一些用C ++编写的东西,但是并没有得到解决这个问题的答案,而是对我的编码风格发了疯,即使当我指出这是WIP的一段代码时那是我打算在运行基本案例时清理它。(我的否决票太多了,因此我决定提出这个问题,因为我在SO上的代表已经非常糟糕了) 这让我想知道为什么人们会采取这样的强硬态度:“你是菜鸟,自己去他妈的”。我被指控像编写Java一样编写C ++。我无法理解的东西仍然让我感到困惑。 我已经用很多OOP语言编程了很多年了,尽管有时是间隔的。我会根据可用的库和最佳的执行环境选择要使用的语言。我在OOP代码中采用了设计模式,并且我非常有信心自己对模式的使用是正确的,并且在OO方面,我可以坚持自己的想法。我了解OOP工具箱,但仅在我认为确实需要时才选择使用这些工具,而不仅仅是使用整洁的技巧来展示我的编码才智。(我知道这不是一流的,但我认为也不是n00b级别)。 在写一行之前,我先设计代码。为了定义测试,我列出了某个类的目标及其必须遵守的测试标准。因为创建序列图然后编写代码对我来说比较容易,所以我选择在界面变得明显之后编写测试。 我必须承认,在我在问题中发布的代码段中,我仍在使用指针,而不是使用智能指针。我会尽可能使用RAII。我知道适当的RAII意味着要防范空指针,但是我会逐步工作。这是一项正在进行的工作,我打算稍后对其进行清理。强烈谴责这种工作方式。 我认为,首先应该有一个可行的示例,这样我才能确定基本案例是否是可行的思维方式。我也碰巧认为,在证明了基本情况之后,清理代码是敏捷重构阶段的典型操作。我必须承认,尽管我慢慢地了解Cxx标准,但我更喜欢使用自己了解的内容,而不是冒着使用尚未在生产代码中掌握的概念的风险。我偶尔会尝试一些新东西,但通常是在我为此而做的游戏项目中。 [edit]我想澄清一下,在我开始提出问题之前,我的搜索结果中并未显示的建议[1]。但是,尽管他的建议确实涵盖了该问题的一个方面,但他所链接的问题并没有回答我问题的核心,只是一部分。我的问题更多是关于我对编码风格的反应以及处理不同编码风格和(明显)技能水平的专业方面。关于我之前关于SO的问题,它就是一个恰当的例子。[/编辑] 然后的问题是:为什么嘲笑不使用您的编码风格的人? 我手头的事务/细分是: 如果重构使重构后的代码更健壮,为什么在原型情况下使用更多容易出错的代码将是不好的编程习惯呢? 用C ++编写的程序如何像用Java编写的一样?是什么使它成为不好的程序,(考虑到我指出了当前风格的意图以及计划中的改进工作)? 如果选择使用某种编程范例(例如OOP / DP)中使用的构造,我将如何成为一名糟糕的专业人员? [1] 快速发展,然后修正错误或缓慢,注意每一行代码?

4
为什么Java不使用某些类的封装?
我的问题与System.in和System.out类有关(可能还有其他类似标准库中的类)。这是为什么?在OOP中这不是不好的做法吗?它不应该被使用,如:System.getIn()和System.getOut()?我一直有这个问题,希望在这里能找到一个好的答案。

5
如何在“不要说话”和“命令查询分隔”之间进行选择?
告诉不要问的原则说: 你应该努力告诉对象你想要他们做什么;不要问他们关于他们的状态的问题,做出决定,然后告诉他们该怎么做。 问题在于,作为调用者,您不应基于所调用对象的状态来做出决定,而导致您随后更改对象的状态。您正在实现的逻辑可能是被调用对象的责任,而不是您的责任。对于您来说,在对象之外进行决策会违反其封装。 一个简单的“告诉,不要问”的例子是 Widget w = ...; if (w.getParent() != null) { Panel parent = w.getParent(); parent.remove(w); } 告诉版本是... Widget w = ...; w.removeFromParent(); 但是,如果我需要知道removeFromParent方法的结果,该怎么办?我的第一个反应就是更改removeFromParent以返回一个布尔值,该布尔值指示是否删除了父对象。 但是后来我遇到了“ 命令查询分离模式”,它说“不要这样做”。 它指出,每个方法都应该是执行操作的命令,或者是将数据返回给调用方的查询,但不能同时是两者。换句话说,提出问题不应改变答案。更正式地讲,方法仅在引用透明且因此没有副作用的情况下才应返回值。 这两个真的是彼此矛盾的,如何在两者之间进行选择?我可以和Pragmatic Programmer或Bertrand Meyer一起使用吗?
25 java  coding 

17
对于今天的学生来说,入门课程有哪些好的任务?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 我定期教授使用Java编程课程的简介。我想给我的学生一些激动人心的作业,他们可以与之联系或找寻有趣的事物。至少,我希望分配的指令有意义并具有内部凝聚力(例如,某些非常糟糕的编程练习似乎是人为设计的,因此您必须使用所介绍的最新编程构造)。 为了让您对范围有所了解,这里介绍了以下内容: 分配必须使用Java,可以使用一些外部库来完成,但是它必须是简单的API而不是完整的框架 变量,基元和字符串 控制台输入和输出 if,for,while 算术和逻辑运算符 带有线条和形状图的简单图形 静态方法 一维数组 学生不会进入高级主题(例如,不递归,不强调继承)。因此,我不是在寻找复杂的项目:“让他们编写C编译器。我5岁时就做了,这是我学习的唯一方法!” 如果您有比范围更高级的想法,请将其发布在下面链接的“具有挑战性”的问题上,而不是此问题上。 相反,我正在寻找的有趣的想法可以在一个简短的程序中完成。例如: 学生可以编写控制台版本的“星球大战名称”生成器。这实际上是读取Strings并使用substring,但我认为这很有趣。类似的变化是“ Mad Libs ”程序。我在五年前使用了此功能,也许它已经“过时”了。 使用提供给他们的一些三角架,学生可以绘制规则的多边形,并创建有趣的螺旋形状。 使用一些简单的动画类以及提供给他们的大多数代码也不是没有问题。而且,如果您知道可以通过简单的API访问的Twitter或Facebook服务,我将非常感兴趣。 请注意,该问题不同于“ 向初学者挑战Java问题 ”的问题。我并不是要挑战本身,只是很有趣。我认为,如果学生从事的工作很容易回答“为什么有人要编程呢?” 他们就会学得更好。 甚至计算每加仑英里数之类的简单问题也可能很好。虽然,如果有一种方法可以使其更相关,那就更好了。如果您从其他地方(书籍或网站)进行练习,请引用资料来源。 为了帮助您思考当今典型的新生,请查看Beloit Mindset列表,其中有许多示例肯定会让您感到老去。

14
为什么我们在大学学习Java?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 Java通常在学术界发现。背后的原因是什么?
25 java 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.