精华内容
下载资源
问答
  • 关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的。还有的人可能知道Java中的参数传递是传递,但是说不出来为什么。 在开始深入讲解...

    关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的。还有的人可能知道Java中的参数传递是值传递,但是说不出来为什么。

    在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了。如果你有以下想法,那么你有必要好好阅读本文。

    错误理解一:值传递和引用传递,区分的条件是传递的内容,如果是个值,就是值传递。如果是个引用,就是引用传递。

    错误理解二:Java是引用传递。

    错误理解三:传递的参数如果是普通类型,那就是值传递,如果是对象,那就是引用传递。

    实参与形参

    我们都知道,在Java中定义方法的时候是可以定义参数的。比如Java中的main方法:

    public static void main(String[] args)

    这里面的args就是参数。参数在程序语言中分为形式参数和实际参数。

    形式参数:是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。

    实际参数:在调用有参函数时,主调函数和被调函数之间有数据传递关系。在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”。

    简单举个例子:

    public static void main(String[] args) {
        ParamTest pt = new ParamTest();
        pt.sout("Hollis");//实际参数为 Hollis
    }
    
    public void sout(String name) { //形式参数为 name
        System.out.println(name);
    }

    实际参数是调用有参方法的时候真正传递的内容,而形式参数是用于接收实参内容的参数。

    值传递与引用传递

    上面提到了,当我们调用一个有参函数的时候,会把实际参数传递给形式参数。但是,在程序语言中,这个传递过程中传递的两种情况,即值传递和引用传递。我们来看下程序语言中是如何定义和区分值传递和引用传递的。

    值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

    引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

    有了上面的概念,然后大家就可以写代码实践了,来看看Java中到底是值传递还是引用传递 ,于是,最简单的一段代码出来了:

    public static void main(String[] args) {
        ParamTest pt = new ParamTest();
    
        int i = 10;
        pt.pass(i );
        System.out.println("print in main , i is " + i);
    }
    
    public void pass(int j) {
        j = 20;
        System.out.println("print in pass , j is " + j);
    }

    上面的代码中,我们在pass方法中修改了参数j的值,然后分别在pass方法和main方法中打印参数的值。输出结果如下:

    print in pass , j is 20
    print in main , i is 10

    可见,pass方法内部对name的值的修改并没有改变实际参数i的值。那么,按照上面的定义,有人得到结论:Java的方法传递是值传递。

    但是,很快就有人提出质疑了(哈哈,所以,不要轻易下结论咯。)。然后,他们会搬出以下代码:

    public static void main(String[] args) {
        ParamTest pt = new ParamTest();
    
        User hollis = new User();
        hollis.setName("Hollis");
        hollis.setGender("Male");
        pt.pass(hollis);
        System.out.println("print in main , user is " + hollis);
    }
    
    public void pass(User user) {
        user.setName("hollischuang");
        System.out.println("print in pass , user is " + user);
    }

    同样是一个pass方法,同样是在pass方法内修改参数的值。输出结果如下:

    print in pass , user is User{name='hollischuang', gender='Male'}
    print in main , user is User{name='hollischuang', gender='Male'}

    经过pass方法执行后,实参的值竟然被改变了,那按照上面的引用传递的定义,实际参数的值被改变了,这不就是引用传递了么。于是,根据上面的两段代码,有人得出一个新的结论:Java的方法中,在传递普通类型的时候是值传递,在传递对象类型的时候是引用传递。

    但是,这种表述仍然是错误的。不信你看下面这个参数类型为对象的参数传递:

    public static void main(String[] args) {
        ParamTest pt = new ParamTest();
    
        String name = "Hollis";
        pt.pass(name);
        System.out.println("print in main , name is " + name);
    }
    
    public void pass(String name) {
        name = "hollischuang";
        System.out.println("print in pass , name is " + name);
    }

    上面的代码输出结果为

    print in pass , name is hollischuang
    print in main , name is Hollis

    这又作何解释呢?同样传递了一个对象,但是原始参数的值并没有被修改,难道传递对象又变成值传递了?

    Java中的值传递

    上面,我们举了三个例子,表现的结果却不一样,这也是导致很多初学者,甚至很多高级程序员对于Java的传递类型有困惑的原因。

    其实,我想告诉大家的是,上面的概念没有错,只是代码的例子有问题。来,我再来给大家画一下概念中的重点,然后再举几个真正恰当的例子。

    值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

    引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

    那么,我来给大家总结一下,值传递和引用传递之前的区别的重点是什么。

    我们上面看过的几个pass的例子中,都只关注了实际参数内容是否有改变。如传递的是User对象,我们试着改变他的name属性的值,然后检查是否有改变。其实,在实验方法上就错了,当然得到的结论也就有问题了。

    为什么说实验方法错了呢?这里我们来举一个形象的例子。再来深入理解一下值传递和引用传递,然后你就知道为啥错了。

    你有一把钥匙,当你的朋友想要去你家的时候,如果你直接把你的钥匙给他了,这就是引用传递。这种情况下,如果他对这把钥匙做了什么事情,比如他在钥匙上刻下了自己名字,那么这把钥匙还给你的时候,你自己的钥匙上也会多出他刻的名字。

    你有一把钥匙,当你的朋友想要去你家的时候,你复刻了一把新钥匙给他,自己的还在自己手里,这就是值传递。这种情况下,他对这把钥匙做什么都不会影响你手里的这把钥匙。

    但是,不管上面哪种情况,你的朋友拿着你给他的钥匙,进到你的家里,把你家的电视砸了。那你说你会不会受到影响?而我们在pass方法中,改变user对象的name属性的值的时候,不就是在“砸电视”么。你改变的不是那把钥匙,而是钥匙打开的房子。

    还拿上面的一个例子来举例,我们真正的改变参数,看看会发生什么?

    public static void main(String[] args) {
        ParamTest pt = new ParamTest();
    
        User hollis = new User();
        hollis.setName("Hollis");
        hollis.setGender("Male");
        pt.pass(hollis);
        System.out.println("print in main , user is " + hollis);
    }
    
    public void pass(User user) {
        user = new User();
        user.setName("hollischuang");
        user.setGender("Male");
        System.out.println("print in pass , user is " + user);
    }

    上面的代码中,我们在pass方法中,改变了user对象,输出结果如下:

    print in pass , user is User{name='hollischuang', gender='Male'}
    print in main , user is User{name='Hollis', gender='Male'}

    我们来画一张图,看一下整个过程中发生了什么,然后我再告诉你,为啥Java中只有值传递。

     

    稍微解释下这张图,当我们在main中创建一个User对象的时候,在堆中开辟一块内存,其中保存了name和gender等数据。然后hollis持有该内存的地址0x123456(图1)。

    当尝试调用pass方法,并且hollis作为实际参数传递给形式参数user的时候,会把这个地址0x123456交给user,这时,user也指向了这个地址(图2)。

    然后在pass方法内对参数进行修改的时候,即user = new User();,会重新开辟一块0X456789的内存,赋值给user。后面对user的任何修改都不会改变内存0X123456的内容(图3)。

    上面这种传递是什么传递?肯定不是引用传递,如果是引用传递的话,在执行user = new User();的时候,实际参数的引用也应该改为指向0X456789,但是实际上并没有。

    通过概念我们也能知道,这里是把实际参数的引用的地址复制了一份,传递给了形式参数。所以,上面的参数其实是值传递,把实参对象引用的地址当做值传递给了形式参数。

    我们再来回顾下之前的那个“砸电视”的例子,看那个例子中的传递过程发生了什么。

     

    同样的,在参数传递的过程中,实际参数的地址0X1213456被拷贝给了形参,只是,在这个方法中,并没有对形参本身进行修改,而是修改的形参持有的地址中存储的内容。

    所以,值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参。在判断实参内容有没有受影响的时候,要看传的的是什么,如果你传递的是个地址,那么就看这个地址的变化会不会有影响,而不是看地址指向的对象的变化。就像钥匙和房子的关系。

    那么,既然这样,为啥上面同样是传递对象,传递的String对象和User对象的表现结果不一样呢?我们在pass方法中使用name = "hollischuang";试着去更改name的值,阴差阳错的直接改变了name的引用的地址。因为这段代码,会new一个String,再把引用交给name,即等价于:

    name = new String("hollischuang");

    而原来的那个"Hollis"字符串还是由实参持有着的,所以,并没有修改到实际参数的值。

     所以说,Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。

     总结

    无论是值传递还是引用传递,其实都是一种求值策略(Evaluation strategy)。在求值策略中,还有一种叫做按共享传递(call by sharing)。其实Java中的参数传递严格意义上说应该是按共享传递。

    按共享传递,是指在调用函数时,传递给函数的是实参的地址的拷贝(如果实参在栈中,则直接拷贝该值)。在函数内部对参数进行操作时,需要先拷贝的地址寻找到具体的值,再进行操作。如果该值在栈中,那么因为是直接拷贝的值,所以函数内部对参数进行操作不会对外部变量产生影响。如果原来拷贝的是原值在堆中的地址,那么需要先根据该地址找到堆中对应的位置,再进行操作。因为传递的是地址的拷贝所以函数内对值的操作对外部变量是可见的。

    简单点说,Java中的传递,是值传递,而这个值,实际上是对象的引用。

    而按共享传递其实只是按值传递的一个特例罢了。所以我们可以说Java的传递是按共享传递,或者说Java中的传递是值传递。

    转自Hollis 公众号

    展开全文
  • 如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,将... 原因:Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件。不执行 Response.End 后面
    如果使用 Response.End、Response.Redirect 或 Server.Transfer 方法,将出现 ThreadAbortException 异常。您可以使用 try-catch 语句捕获此异常。 原因:Response.End 方法终止页的执行,并将此执行切换到应用程序的事件管线中的 Application_EndRequest 事件。不执行 Response.End 后面的代码行。此问题出现在 Response.Redirect 和 Server.Transfer 方法中,因为这两种方法均在内部调用
     Response.End。 解决方案:要解决此问题,请使用下列方法之一: 对于 Response.Redirect,请使用重载 Response.Redirect(String url, bool endResponse),该重载对 endResponse 参数传递 false 以取消对 Response.End 的内部调用。例如: Response.Redirect ("nextpage.aspx", false);如果使用此替代方法,将执行 Response.Redirect 后面的代码。 对于 Server.Transfer,请改用
     Server.Execute 方法。 把代码改成:Response.Redirect(str,false);问题解决。
    
    展开全文
  • 什么是MTU?为什么MTU普遍都是1500?

    万次阅读 多人点赞 2019-09-04 14:29:25
    什么是MTU Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。 这是哪一层网络的概念? 从下面这个表格中可以看到,在7层网络协议中,MTU是数据链路层的概念。MTU限制的是数据链路层的payload,也...

    原文地址:

    https://yq.aliyun.com/articles/222535

    感谢作者!

     

    什么是MTU

    Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。

    这是哪一层网络的概念?

    从下面这个表格中可以看到,在7层网络协议中,MTU是数据链路层的概念。MTU限制的是数据链路层的payload,也就是上层协议的大小,例如IP,ICMP等。

    OSI中的层 功能 TCP/IP协议族
    应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
    表示层 数据格式化,代码转换,数据加密 没有协议
    会话层 解除或建立与别的接点的联系 没有协议
    传输层 提供端对端的接口 TCP,UDP
    网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
    数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
    物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2

    MTU有什么用?

    举一个最简单的场景,你在家用自己的笔记本上网,用的是路由器,路由器连接电信网络,然后访问了www.baidu.com,从你的笔记本出发的一个以太网数据帧总共经过了以下路径:

    笔记本 -> 路由器 -> 电信机房 -> 服务器

    其中,每个节点都有一个MTU值,如下:

    1500     1500                 1500
    笔记本 -> 路由器 -> 电信机房  -> 服务器

    假设现在我把笔记本的MTU最大值设置成了1700,然后发送了一个超大的ip数据包(2000),这时候在以外网传输的时候会被拆成2个包,一个1700,一个300,然后加上头信息进行传输。

    1700     1500                1500
    笔记本 -> 路由器 -> 电信机房 -> 服务器

    路由器接收到了一个1700的帧,发现大于自己设置的最大值:1500,如果IP包DF标志位为1,也就是不允许分包,那么路由器直接就把这个包丢弃了,根本就不会到达电信机房,也就到不了服务器了,所以,到这里我们就会发现,MTU其实就是在每一个节点的管控值,只要是大于这个值的数据帧,要么选择分片,要么直接丢弃。

    为什么是1500?

    其实一个标准的以太网数据帧大小是:1518,头信息有14字节,尾部校验和FCS占了4字节,所以真正留给上层协议传输数据的大小就是:1518 - 14 - 4 = 1500,那么,1518这个值又是从哪里来的呢?

    假设取一个更大的值

    假设MTU值和IP数据包大小一致,一个IP数据包的大小是:65535,那么加上以太网帧头和为,一个以太网帧的大小就是:65535 + 14 + 4 = 65553,看起来似乎很完美,发送方也不需要拆包,接收方也不需要重组。

    那么假设我们现在的带宽是:100Mbps,因为以太网帧是传输中的最小可识别单元,再往下就是0101所对应的光信号了,所以我们的一条带宽同时只能发送一个以太网帧。如果同时发送多个,那么对端就无法重组成一个以太网帧了,在100Mbps的带宽中(假设中间没有损耗),我们计算一下发送这一帧需要的时间:

    ( 65553 * 8 ) / ( 100 * 1024 * 1024 ) ≈ 0.005(s)

    在100M网络下传输一帧就需要5ms,也就是说这5ms其他进程发送不了任何数据。如果是早先的电话拨号,网速只有2M的情况下:

    ( 65553 * 8 ) / ( 2 * 1024 * 1024 ) ≈ 0.100(s)

    100ms,这简直是噩梦。其实这就像红绿灯,时间要设置合理,交替通行,不然同一个方向如果一直是绿灯,那么另一个方向就要堵成翔了。

    既然大了不行,那设置小一点可以么?

    假设MTU值设置为100,那么单个帧传输的时间,在2Mbps带宽下需要:

    ( 100 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 ≈ 5(ms)

    时间上已经能接受了,问题在于,不管MTU设置为多少,以太网头帧尾大小是固定的,都是14 + 4,所以在MTU为100的时候,一个以太网帧的传输效率为:

    ( 100 - 14 - 4 ) / 100 = 82%

    写成公式就是:( T - 14 - 4 ) / T,当T趋于无穷大的时候,效率接近100%,也就是MTU的值越大,传输效率最高,但是基于上一点传输时间的问题,来个折中的选择吧,既然头加尾是18,那就凑个整来个1500,总大小就是1518,传输效率:

    1500 / 1518 =  98.8%

    100Mbps传输时间:

    ( 1518 * 8 ) / ( 100 * 1024 * 1024 ) * 1000 = 0.11(ms)

    2Mbps传输时间:

    ( 1518 * 8 ) / ( 2 * 1024 * 1024 ) * 1000 = 5.79(ms)

    总体上时间都还能接受

    最小值被限制在64

    为什么是64呢?

    这个其实和以太网帧在半双工下的碰撞有关,感兴趣的同学可以自行去搜索。

    在我玩游戏的时候,为什么把MTU改成1480就不卡了?

    路由器默认值大多都是1500,理论上是没有问题的,那为什么我玩游戏的时候改成1480才能流畅呢?原因在于当时我使用的是ADSL上网的方式,ADSL使用的PPPoE协议。

    PPPoE

    PPPoE协议介于以太网和IP之间,协议分为两部分,PPP( Point to Point Protocol )和oE( over Ethernet ),也就是以太网上的PPP协议,而PPPoE协议头信息为:

    | VER(4bit) | TYPE(4bit) | CODE(8bit) | SESSION-ID(16bit) | LENGTH(16bit) |

    这里总共是48位,也就是6个字节,那么另外2个字节是什么呢?答案是PPP协议的ID号,占用两个字节,所以在PPPoE环境下,最佳MTU值应该是:1500 - 6 - 2 = 1492。

    我的上网方式

    当时我的上网路径如下:

    PC -> 路由器 -> 电信

    我在路由器进行拨号,然后PC连接路由器进行上网。

    最根本原因

    问题就出在路由器拨号,如果是PC拨号,那么PC会进行PPPoE的封装,会按照MTU:1492来进行以太网帧的封装,即使通过路由器,路由器这时候也只是转发而已,不会进行拆包。

    而当用路由器拨号时,PC并不知道路由器的通信方式,会以网卡的设置,默认1500的MTU来进行以太网帧的封装,到达路由器时,由于路由器需要进行PPPoE协议的封装,加上8字节的头信息,这样一来,就必须进行拆包,路由器把这一帧的内容拆成两帧发送,一帧是1492,一帧是8,然后分别加上PPPoE的头进行发送。

    平时玩游戏不卡,是因为数据量路由器还处理得过来,而当进行群怪AOE的时候,由于短时间数据量过大,路由器处理不过来,就会发生丢包卡顿的情况,也就掉线了。

    帖子里面提到的1480,猜测可能是尽量设小一点,避免二次拨号带来的又一次PPPoE的封装,因为时间久远,没办法回到当时的场景再去抓包了。

    结论

    1518这个值是考虑到传输效率以及传输时间而折中选择的一个值,并且由于目前网络链路中的节点太多,其中某个节点的MTU值如果和别的节点不一样,就很容易带来拆包重组的问题,甚至会导致无法发送。

    展开全文
  • 当使用类似上述代码编写程序时,就会出现 ”不能为空 参数:DataSet“ 这种错误错误原因如下: 在使用 DataGridView数据加载按钮的单击方法函数btnLoad_Click()中,使用  dataGridView1....

            // DataGridView数据加载按钮
    	private void btnLoad_Click(object sender, EventArgs e)
            {
                try
                {
                    string strSql = "select * from studentgrade"; 
                    DataSet ds = dbhelper.getDataSet(strSql);
                    dataGridView1.DataSource = ds.Tables[0];
                }
                catch (Exception ex)
                {
                    MessageBox.Show("数据表格加载失败:" + ex.Message);
                }
            }
    	// DataGridView数据修改按钮
            private void btnSaveUpdate_Click(object sender, EventArgs e)
            {
                try 
                {
                    string dbConnectionString = "Provider=MSDAORA;Data Source=XE;Password=TEST001;User ID=TEST";
                    using (OleDbConnection connection = new OleDbConnection(dbConnectionString))
                    {
                        string queryString = "select * from studentgrade";
                        OleDbDataAdapter adapter = new OleDbDataAdapter(queryString, connection);
                        //adapter.SelectCommand = new OleDbCommand(queryString, connection);
                        OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
                        
                        connection.Open();
                        DataSet ds = dataGridView1.DataSource as DataSet;
                        int i = adapter.Update(ds);
                        connection.Close();
                        if (i > 0)
                        {
                            MessageBox.Show("数据更新成功!");
                        }
                        load();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("数据更新保存失败:" + ex.Message);
                }
            }


    当使用类似上述代码编写程序时,就会出现 ”值不能为空 参数值:DataSet“ 这种错误,错误原因如下:


    在使用 DataGridView数据加载按钮的单击方法函数btnLoad_Click()中,使用 

    dataGridView1.DataSource = ds.Tables[0];
    DataTable的格式来填充DataGridView的数据源。

    但是,在后续的 DataGridView数据修改按钮的单击方法函数btnSaveUpdate_Click()中,

                        DataSet ds = dataGridView1.DataSource as DataSet;
    使用DataSet 的类型来转换已经被DataTable类型填充的DataGridView数据源,造成将dataGridView1使用as运算符转换为DataSet类型失效,执行过程中ds结果为null值,因而在执行

                        int i = adapter.Update(ds);
    后,出现”值不能为空 参数值:DataSet“的错误异常。


    应该将上述代码的btnLoad_Click()修改为下面代码:

            // DataGridView数据加载按钮
    	private void btnLoad_Click(object sender, EventArgs e)
            {
                try
                {
                    string strSql = "select * from studentgrade"; 
                    DataSet ds = dbhelper.getDataSet(strSql);
                    dataGridView1.DataSource = ds;
                    dataGridView1.DataMember = ds.Tables[0].TableName;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("数据表格加载失败:" + ex.Message);
                }
            }


    展开全文
  • 原SQL写法: //生成表结构 // sErr := OpenSql('SELECT CAST(0 AS INTEGER) AS iStep, CAST('''' AS VARCHAR(40)) AS StepName, CAST('''' AS VARCHAR(2000)) AS MsgText', qryMsg);...错误写法:sErr := OpenSql(...
  • 在开发过程中,遇到了一个问题,困扰了我好一阵子,问题是这样的: 这是Oracle数据库中的一个表,orderno是序列号,每次插入数据时加1 我们取序列号最大的,按理说,orderno最大的应该是11,但是事实是这样的...
  • (1)sql语句原因:因为access数据库对join语法支持有局限性,所以在写access数据库join语句的时候注意sql的格式 (2)字段名字写错:对比sql各字段名字是否和数据表中的字段名一致
  • 2019-02-19 碰到一个登录后从token取不到tokenId的问题,debug后没有发现什么异常; 2019-02-20 解决ing…
  • DataGridViewComboxCell无效 的原因

    千次阅读 2014-05-11 22:52:08
    致"DataGridViewComboxCell无效"大致有两个原因: 1.没有绑定这个comboxcell的数据源datasource,而却绑定了表格的DataPropertyName 2.数据源datasource绑定成功,但其ValueMember的类型与绑定了表格的...
  • freemarker取不到原因

    千次阅读 2018-05-15 14:13:00
    由于有个项目是使用freemarker开发的,这里总结下使用freemarker过程中导致取不到的一些原因,也是自己有时候经常犯的一些错误,供大家借鉴! freemarker取不到值原因: (1)后台没有传值过来!  可以现在...
  • 今天继续看道路识别代码的时候,看到mask这一段,想把图片保存下来看看...我直接把他最后二化好的矩阵输出来看,才发现这个函数里面255是白色的数值,而我在二化的时候是把1作为白色的(虽然都能显示出来)。...
  • location Error, ErrCode:7, errInfo:KEY错误 errInfo:KEY错误 请到http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/查看错误码说明,错误详细信
  • 获取本地SHAI,配置到高德官网,仍然key错误,试了...如果你也有同样的问题,而且可以试试,下载个如下手机端获取SHAI的app,写上包名,然后将此SHAI部署到高德官网,即可,等有时间时,再好好寻找下问题原因。 ...
  • Java 是传递还是引用传递

    万次阅读 多人点赞 2019-03-20 02:40:16
    首先说下我的感受,这个题目出的很好,但是在 Java 中这个题目是有问题的(在下面我会解释)。并且,有很多结论是 Java 中只有 传递。我认为这样说不够严谨。当然如果针对 Java 语言本身来讲,Java 中只有 传递,...
  • PHP-Session无法获取的可能原因

    千次阅读 2018-04-18 19:46:42
    最近在写PHP的时候遇到了这个问题,session在整个网站没有关闭的情况下会一直存在,但是在一个页面初始化了session之后,我发下在另一个页面死活拿不到session,用echo打印session信息发现根本就没有传递进来...
  • servlet在后台获取不到原因

    千次阅读 2017-11-28 16:07:19
    关于Servlet在后台接收不到前端传递的数据问题,可能原因如下: 1、前端传递的参数名和后台获取数据时使用的参数名不一致 2、Servlet接收参数时(包括URL传递参数),方法调用错误 我就是因为使用了错误的方法:...
  • 问题总得解决,首先是想办法将给a赋值是正确完整的,我尝试将input标签的type换成hidden,结果ok,console的结果:a的是正确完整的,可是到后台取不到。。。。。。。。。。。。。。。。。。。尼玛,如果将a 的...
  • 错误:* -[__NSArrayM removeObjectsInRange:]: range {1, 1} extends beyond bounds for...或者传入一个非正常NSNotFound解决方法:调试发现在删除的过程中row的出现错误,与期望的不一致,导致问题原因是因为cell
  • 在vue中关于v-for循环中key中出错的解决方法: 报错原因是key是唯一的,重复使用,查看代码 v-bind:key=“todo.id” 所以在此处id的并不是唯一的,所以需要把v-bind:key="index"就可以了。 ...
  • 错误:void 未如预期地被忽略

    千次阅读 2013-10-11 16:45:10
    其实原因很简单,就是说明你自己的函数定义的时候是没有返回值的void型的,而你在使用的时候又认为它是有返回值的,你可能用了一个变量来接受它的或者用它的来进行比较等这些操作都是错误的不合理的。...
  • Freemarker不显示对象的属性原因

    千次阅读 2017-10-28 00:33:20
    Freemarker不显示对象的属性原因今天使用Freemarker在springboot项目中通过模板生成一些html文件。但是发现没有显示对象的属性。 找了很长时间,终于发现不显示对象的属性可能是两个原因造成的: 属性没有...
  • 矩阵奇异的物理意义是什么

    千次阅读 2018-01-03 16:48:07
    作者:知乎用户链接:... ... 矩阵奇异的物理意义是什么? 或者说,奇异形象一点的意义是什么? 把m*n矩阵看作从m维空间到n维空间的一个线性映射, 是否:
  • 【Hive】partition分区日期值错误

    千次阅读 2018-10-15 14:27:35
    执行类似以上sql时,最终跑出来的date1值没有问题,但是分区字段date则会+1day,出现值错误,很诡异; 找了很久原因,失败告终,最终使用一个很白痴的方法解决:date_add(date_add(date, -1), ...
  • SELECT CONVERT(VARCHAR...无法执行 varchar 到 varchar 的隐式转换,原因是,由于排序规则冲突,该的排序规则未经解析。 修改为: SELECT CONVERT(VARCHAR(100), 列名 COLLATE Chinese_PRC_CI_AS) FROM Table
  • 传入0使用MyBatis查询不生效的原因

    千次阅读 2018-07-24 18:16:26
    这是什么原因呢? 这其实是MyBatis的一个坑。博主就遇到了,特此写下这篇文章来记录下。 有个是否激活的查询,查询激活的没有问题,查询未激活的就是不生效。 在MyBatis中自动判断Integer为0时为false,即...
  • Segmentation Fault错误原因总结

    万次阅读 多人点赞 2017-09-01 17:24:52
    一、 什么是“Segmentation fault in Linux”所谓的段错误就是指访问的内存超过了系统所给这个程序的内存空间,通常这个是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存...
  • 1>libprotobuf.lib(common.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: “0”不匹配“2”(newSerializer.obj 中) 错误, 产生这个问题原因是当前工程是Debug版本,而引用的库文件时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,390,588
精华内容 556,235
关键字:

值错误是什么原因