您不应该错过的堆栈溢出问题集合:
这不是秘密; 我们都使用堆栈溢出。 它掌握了生命,宇宙以及几乎所有与代码相关的内容的答案。 该平台为开发人员,工程师和其他人员提供了一个找到他们所面临问题的答案的地方,或者至少使他们处于解决方案的正确轨道上。
Java是Stack Overflow上最受欢迎的类别之一,总共提出了将近150万个问题,并且每天增加数百个问题。 它为您在日常任务中偶然发现的问题提供了一些非常有趣的答案,以及对您不知道应该问的问题的答案。
我们总是可以学习到一些新的东西,而这正是我们决定要寻找的东西:对我们所不知道的问题的有趣答案。 让我们来看看。
Java难题
堆栈溢出是寻找答案的地方,但它也是解决更多问题和谜语的好地方。 来自荷兰的软件开发人员Kevin Cruijssen发布了以下问题:
为什么array [idx ++] + =“ a”在Java 8中增加一次idx,而在Java 9和10中增加两次?
为了证明这一点,他创建了以下代码:
import java.util.*;
public class Main {public static void main(String[] args) {int size = 3;String[] array = new String[size];Arrays.fill(array, "");for(int i = 0; i <= 100; ) {array[i++%size] += i + " ";}for(String element: array) {System.out.println(element);}}
}
在Java 8中运行它,我们得到以下输出:
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97 100
2 5 8 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68 71 74 77 80 83 86 89 92 95 98 101
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
但是,在Java 10中,我们得到以下信息:
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100 102
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98 100
在继续阅读之前,您可以尝试猜测这里发生了什么吗? 是什么导致了版本之间的不同输出的神秘Java属性?
准备不知所措:这是javac中的一个错误,该错误始于JDK9。根据正式的错误报告,当对字符串操作数应用“ + =”时,可能会产生一些副作用,如上面的代码所示。
乔恩·韦尔尼 ( Jorn Vernee )将此答案向前推进了一步,并查看了此行的相应字节码:
array [i ++%size] + = i +”“;
这是输出:
21: aload_222: iload_323: iinc 3, 126: iload_127: irem28: aload_229: iload_330: iinc 3, 133: iload_134: irem35: aaload36: iload_337: invokedynamic #5, 0 // makeConcatWithConstants:(Ljava/lang/String;I)Ljava/lang/String;42: aastore
好的一面是,此问题已修复,并将与其他一些不错的功能一起在JDK 11中部署。
NullPointerException的重要性
您花了多少时间浏览日志,试图查找异常并处理它们? 我们已经知道答案了-太久了。 确实,Stack Overflow提供了一个地方,我们可以在这里查询和搜索有关问题的正确答案,并且在大多数情况下,过去有人已经遇到过同样的问题。
开发人员遇到的最常见的异常之一是NullPointerException。 实际上,这是Java生产环境中最常见的例外。 一个引起我们注意的问题是有人试图通过问“ 什么是NullPointerException,以及如何解决它? ”来找到问题的根本原因。 。”
投票最多的答案将其分解为步骤,因此更容易理解过程中发生的情况。 它首先声明一个对象的指针,再声明一个引用变量。
Integer num;
num = new Integer(10);
第一行是指针,由于我们没有说明要指向的内容,因此Java将其设置为null。 仅在第二行中创建对象类型Integer,并将指针变量num分配给该对象。
在声明变量但未创建对象之后,在第一行发生NullPointerException。 如果在创建对象之前尝试取消引用num,则将获得NullPointerException。 在大多数情况下,编译器会发现问题,并告知“ num可能尚未初始化”,但有时您编写的代码不会直接创建该对象。
你怎么解决呢? Stack Overflow上最受关注的方法之一是在整个代码中添加空检查。 但是,您最终会得到太多如下所示的代码行:
if (someobject != null) {someobject.doCalc();
}
同样, Stack Overflow可以帮助我们提高此代码的效率。 在合同无效的情况下,或者在代码无效的情况下,在代码中检查null是有意义的。
第一个建议很简单:不要使用null作为响应。 但是,如果null为有效响应,则必须对其进行检查。 使用返回集合的方法会更容易。 我们可以返回空集合(或数组)而不是null。
如果不使用集合,则可以使用Null Object模式。 在此模式中,我们使用一个实现预期接口的对象,其方法主体为空。 要将其放入代码中,请进行以下比较:
Parser parser = ParserFactory.getParser();
if (parser == null) {// now what?// this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {// do nothing
} else {action.doSomething();
}
对此:
ParserFactory.getParser().findAction(someInput).doSomething();
如果是我们提到的第二种情况,null不是有效的响应,则可以使用assert语句。 因此,它看起来像这样:
assert <condition>
//or
assert <condition> : <object>
您还可以通过其他方法来处理NullPointerExceptions以及为何它如此重要的解释- 看看 。
Java 10中的局部变量类型推断
Java 10中最受关注的更改之一是引入了局部变量类型推断,这为Java添加了一些语法功能,从而简化了它并改善了开发人员的体验。
Java 10允许我们声明变量而不必指定关联的类型。 所以:
List<String> list = new ArrayList<String>();
Stream<String> stream = getStream();
将被以下新的简化语法取代:
var list = new ArrayList();
var stream = getStream();
这种变化导致了一个有趣的问题。 Kotlin和Java中的var有什么区别? 正如阿列克谢·罗曼诺夫(Alexey Romanov)解释的那样,它们的含义有很大不同。
在Kotlin中,var表示“这是一个可变变量”,并且可以在推断类型和显式类型时使用。 另一方面,Java中var的含义是“这是具有推断类型的变量”,并且可用于可变变量和最终变量。
最重要的是,Java中的var只能用于局部变量。 而Kotlin中的var也用于属性。
最后的想法
堆栈溢出不仅仅是一个问答站点。 这是一个社区,人们可以互相帮助,进行热烈的讨论,然后开始玩乐。
如果您需要一段代码的帮助或遇到无法解决的有趣谜语,那么这是理想的选择。 这些问题仅占您所能找到的一小部分,如果您已经看到值得认为的问题,我们想知道! 在下面的评论中发布您最喜欢的答案或未回答的问题。
翻译自: https://www.javacodegeeks.com/2018/07/stack-overflow-top-java-questions.html