我根据ahrefs上的数据筛选出Stack Overflow上流量最高的5个问题。这些问题非常受欢迎且具有很高的参考价值。问题排名按照问题所在页面流量从高到低进行。在这篇文章中,我会将问题的原始链接放在它的标题上,如果你想要查看问题原始页面的话,可以点开链接。我会用自己的话简述一遍问题,因为有时候问题作者对问题进行了多次编辑比较混乱,然后我会附上这个问题的最佳回答。

ps:Stack Overflow上的问题和回答大部分都是用英文写出来的,为了方便阅读,我将使用中文进行表述。

排名方法

  • 登录ahrefs网站
  • 点开“Site Explorer页面”
  • 在地址输入框中输入“stackoverflow.com/questions”
  • 点击搜索按钮
  • 在左侧边栏中找到并点击“Top Pages”
  • 国家选择“All countries”
  • “Traffic”从高到低排序

流量:37,156

这个问题创建于10年前。问题作者原本是想实现一个点击按钮之后跳转链接的功能,但是作者查看了收到的回答,并没有满足要求的。目前有两种解决方案,第一种是在form标签中嵌套一个button标签,代码如下:

<form method="get" action="/page2">
    <button type="submit">Continue</button>
</form>

但是这个解决方案有一点不完美就是Safair和IE浏览器会在链接后面添加一个问号。第二个解决方案是使用JavaScript:

<button onclick="window.location.href='/page2'">Continue</button>

但是这个解决方案需要使用JavaScript,屏幕阅读器不能访问这样的链接。

链接的作用就是跳转到另一个页面。所以问题作者换了一种问法,如何把链接的样式变成像按钮一样。

<a href="https://zhaoshuquan.com" class="button">Go to Google</a>
a.button {
    -webkit-appearance: button;
    -moz-appearance: button;
    appearance: button;

    text-decoration: none;
    color: initial;
}

什么是NullPointer, 怎么修复这个问题?(What is a NullPointerException, and how do I fix it?)

Java,流量:32,036

这个问题创建于12年前。作者的问题是什么是空指针异常(java.lang.NullPointerException),这个异常是怎么产生的。当异常发生的时候,有什么方法或工具可以定位这个异常并找到导致这个异常的原因。

下面是这个问题的最佳回答。当你定义一个引用变量(例如:一个对象)时,其实你定义的是一个指向对象的指针。下面这个代码定义了一个原生类型为int的变量:

int x; x = 10; 在这个例子中,变量x是int类型,Java会将x初始化为0。第二行代码将x赋值为10,10被写入到x指定的内存地址。

但是,当你尝试定义一个引用类型,就会发生一些不一样的事情。来看一下下面的代码:

Integer num;
num = new Integer(10);

上面这个代码首先定义了一个num变量,但是这个变量还没有包含任何原生类型值。相反,这个变量包含一个指针(因为这个变量的类型是Integer,这是一个引用类型)。因为你定义完变量之后还没有对变量进行初始化,定义这个引用类型的变量num应该指向什么,所以Java把num设置为指向null,意思就是“num什么都没有指向”。

上面代码的第二行,使用new关键词创建一个类型为Integer的对象,然后将num指向这个Integer对象。

当你尝试使用一个变量的内容(解引用,dereferencing),但是你还没有对这个变量进行赋值的时候,就会出现NullPointerException。

解引用通常发生在使用.调用方法或字段,或者使用[去索引一个数组。

在没有将num指向一个对象之前,如果你尝试去解引用num,你就会看到NullPointerException。

在有些情况下,编译器会找到出现问题的原因并告诉你“num may not have been initialized”(num变量可能没有被初始化),但是有时候你并不是直接创建一个对象的。

例如以下代码:

public void doSomething(SomeObject obj) {
   //调用obj的方法,假设obj是null
   obj.myMethod();
}

在这个例子中,我们不创建一个obj变量,而是假设在调用doSomething()方法之前,obj变量已经被创建了。我们可能按照以下方法调用doSomething()方法:

doSomething(null);

在这种情况下,obj为null,并且语句obj.myMethod()将抛出NullPointerException。

如果像上面这个代码那样调用doSomething()方法,则跑出NullPointerException就是合适的,因为这是程序员错误,并且程序员需要这个信息来调试代码。

除了由于方法逻辑引发的NullPointerException之外,你还可以检查方法参数是否为null,然后抛出NullPointerException,这个可以通过在方法开头添加以下代码来实现:

// 如果obj为null,则将带有自定义错误消息的NullPointerException抛出
Objects.requireNonNull(obj, "obj must not be null");

在错误消息中清楚说明哪个对象不能为null是很有帮助的。像上面这个代码对变量进行验证的优点是:1)你可以返回你自己设置的错误信息,2)对于这个方法的剩余代码,你可以安全的解引用obj,因为obj一定不为null。

有时候你定义的方法允许参数为null的情况。在这种情况下,你可以通过检查null参数然后执行不一样的操作。你也应该把这种情况在方法文档中解释清楚。例如,doSomething()可以被写为以下形式:

/**
  * @param obj 一个用于__的可选参数。可能为空,在这种情况下
  *  结果为 ____.
  */
public void doSomething(SomeObject obj) {
    if(obj == null) {
       //do something
    } else {
       //do something else
    }
}

IndentationError: unindent does not match any outer indentation level

Python,流量:31,970

问题作者在运行下面这段Python代码的时候遇到一个错误提示:

IndentationError: unindent does not match any outer indentation level
import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

问题作者不知道这个问题是怎么产生的。

这个问题解决方案也是很直接。出现这个错误提示的原因就是上面这段代码混用tab和空格。解决方法是通过代码编辑器的查找和替换功能,将所有的tab字符替换为空格字符(几个空格字符都可以,一个两个都没问题)。下面给出替换之后的代码:

import sys

def Factorial(n): # return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

print Factorial(10)

Uncaught ReferenceError: $ is not defined?

流量:29,042

问题作者遇到了以下错误提示:

Uncaught ReferenceError: $ is not defined

代码在这里:

$(document).ready(function() {
    $('#tabs > ul').tabs({ fx: { opacity: 'toggle' } });
    $('#featuredvid > ul').tabs();
});
<script language="JavaScript" type="text/javascript" src="<?php echo get_option('siteurl') ?>/js/sprinkle.js"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo get_option('siteurl') ?>/js/jquery-1.2.6.min.js"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo get_option('siteurl') ?>/js/jquery-ui-personalized-1.5.2.packed.js"></script>

这个问题目前还没有一个高分且被接受的回答。这里,我就总结一下目前已经存在的几种回答。

第一种回答,这个回答观察到问题作者的JavaScript包引入的时候使用了PHP代码,认为这段代码是和PHP代码或者模板引擎一起使用的,所以这个回答说如果问题作者使用的是Laravel框架,错误就有可能来源于Blade模板文件,注意需要使用正确的blade指令标签将JavaScript包引入代码正确引入:

@section('section name')
// put javascript files in here
@endsection

第二种回答是将最新的jquery包CDN链接放在HTML代码的head标签顶部,下面是代码示例:

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
  $("button").click(function(){
    $("h2").hide();
  });
});
</script>
</head>
<body>

<h2>This will hide me</h2>


<button>Click me</button>

</body>
</html>

第三种回答是,问题作者应该在引入jQuery之后,再调用相关函数。

根据问题作者给出的代码来看,因为jquery引入顺序导致出现这个问题的可能性最高,但是10年过去了,问题作者依然没有接受任何一个回答。

Failed to load resource: the server responded with a status of 404 (Not Found)

流量:27,868

这个问题是因为资源链接设置错误导致的,问题作者相关代码如下:

CSS:

<link  href="../Jquery/jquery.multiselect.css" rel="stylesheet"/>
<link  href="../Jquery/style.css" rel="stylesheet" />
<link  href="../Jquery/prettify.css" rel="stylesheet" />

JS

<script  src="../Jquery/jquery.multiselect.js"></script>
<script  src="../Jquery/prettify.js"></script>

Error

Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:8080/RetailSmart/jsp/Jquery/jquery.multiselect.css
Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:8080/RetailSmart/jsp/Jquery/style.css
Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:8080/RetailSmart/jsp/Jquery/prettify.css
Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:8080/RetailSmart/jsp/Jquery/jquery.multiselect.js
Failed to load resource: the server responded with a status of 404 (Not Found) http://localhost:8080/RetailSmart/jsp/Jquery/prettify.js

目录结构

这个问题的解决方案是,回两次目录,当前目录的上两层目录,

 <script  src="../../Jquery/prettify.js"></script>