• 关于

    java定义数值

    的搜索结果

回答

int 是基本数据类型(面向过程留下的痕迹,不过是对Java的有益补充)Integer 是一个类,是int的扩展,定义了很多的转换方法类似的还有:float Float、double Double、string String等 。举个例子:当需要往ArrayList,HashMap中放东西时,像int,double这种内建类型是放不进去的,因为容器都是装object的,这是就需要这些内建类型的外覆类了。Java中每种内建类型都有相应的外覆类。Java中int和Integer关系是比较微妙的。关系如下:1、int是基本的数据类型;2、Integer是int的封装类;3、int和Integer都可以表示某一个数值;4、int和Integer不能够互用,因为他们两种不同的数据类型;1.从定义上来看int 是基本类型,直接存数值(类似的还有float、double、String、char)Integer是对象,用一个引用指向这个对象(类似的有Float、Double、String)2.从复杂度来看,Java 中的数据类型分为基本数据类型和复杂数据类型int 是前者;Integer 是后者(也就是一个类)3.初始化的方式不同int i =1;Integer i= new Integer(1);//integer 是一个类int 是基本数据类型(面向过程留下的痕迹,不过是对java的有益补充);Integer 是一个类,是int的扩展,定义了很多的转换方法注意:类似的还有:float Float;double Double;String等,其中String较为特殊,基本类型和复杂类似关键字相同。例如,当需要往ArrayList,HashMap中放东西时,像int,double这种内建类型是放不进去的,因为容器都是装 object的,这是就需要这些内建类型的外覆类了。Java中每种内建类型都有相应的外覆类。Java中int和Integer关系是比较微妙的。关系如下:int是基本的数据类型;Integer是int的封装类;int和Integer都可以表示某一个数值;int和Integer不能够互用,因为他们两种不同的数据类型;举例说明ArrayList A_List=new ArrayList();int n=40;Integer In=new Integer(n);A_List.add(n);//errorA_List.add(In);//ok
蛮大人123 2019-12-02 02:21:23 0 浏览量 回答数 0

回答

定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。 分类 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,double) 字符型(char) 布尔型(boolean) 引用数据类型 类(class) 接口(interface) 数组([]) Java基本数据类型图
问问小秘 2020-03-27 16:24:35 0 浏览量 回答数 0

问题

问一个搜索问题

是这样的,我数据库中每一个文档都是这样定义的:key value type_id 3333333333 string因为value的数值是10位数,因此在java里只能用str...
落地花开啦 2019-12-01 19:57:18 819 浏览量 回答数 1

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

建个炫酷的简历网页,制作一个浪漫的表白网页,打造个人专属网盘,多种动手场景应用免费学!!!

回答

" FILE_NOT_EXIST的值是 -197 栗子: TencentCosStatus.FILE_NOT_EXIST.getCode() == -197 // true###### 题主可以搜下枚举类型的相关资料。这个类是枚举类。里面那些是定义常量,不会再更改的。###### FILE_NOT_EXIST( -197) FILE_NOT_EXIST 是 TencentCosStatus 的一个成员(field),后面一个的"( -197)" 是这个成员的初始化值,即 FILE_NOT_EXIST 的值为:-197,如果不写则是才有 enum 默认分配。 其他:感觉 java enum 用的不多,因为 静态常量成员完全可以代替枚举;197 这个数值也很少用到,因为一般使用TencentCosStatus.FILE_NOT_EXIST。我这看到的对 enum 成员设置自定义数值,需要定义构造函数。###### 枚举(enum)常量(实例),建议复习 Core Java。###### 這是枚舉類型,規定了用數據代替某種信息,類似於404代表source not found一樣###### 百度一下“java 枚举”###### 枚举 C#中同样存在 enum Man { 刘备 = 1, 关羽 = 2, 张飞 = 3 } 为了防止写出魔鬼数字。" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/9c7d4381fb7742649ef7a31ff5095881.png)
因为相信,所以看见。 2020-05-27 10:17:06 0 浏览量 回答数 0

回答

在序列化过程中,如果被序列化的类中定义了writeObject 和 readObject 方法, 虚拟机会试图调用对象类里的 writeObject 和 readObject 方法,进行用户自定义的 序列化和反序列化。 如果没有这样的方法,则默认调用是 ObjectOutputStream 的 defaultWriteObject 方法以及 ObjectInputStream 的 defaultReadObject 方法。 用户自定义的 writeObject 和 readObject 方法可以允许用户控制序列化的过程, 比如可以在序列化的过程中动态改变序列化的数值。 所以,对于一些特殊字段需要定义序列化的策略的时候,可以考虑使用transient 修饰, 并自己重写writeObject 和 readObject 方法, 如java.util. ArrayList 中就有这样的实现。
huc_逆天 2021-01-11 11:49:52 0 浏览量 回答数 0

回答

Java中的数组是定长的!你这样int[] a ={}; 定义出来的数组a 长度为0,已经是定长了,之后再给它赋值是不可以的,因为它的长度定义出来之后是不可改变的了。所以在使用数组的时候,一定要注意长度,不能超过这个长度,负责就数组下表越界了。如果是标明全部格式,就必须给定一个数值,否则返回时出错;刚开始可以用变量名,在后面再new一个数组,也可以一个个添加!把数组可以看作是一个变量,比普通的变量难理解而已!
蛮大人123 2019-12-02 02:18:00 0 浏览量 回答数 0

回答

Java 语言定义了一些异常类在 java.lang 标准包中。 标准运行时异常类的子类是最常见的异常类。由于 java.lang 包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。 Java 根据各个类库也定义了一些其他的异常,下面的表中列出了 Java 的非检查性异常。 异常描述ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。ArrayIndexOutOfBoundsException用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。ClassCastException当试图将对象强制转换为不是实例的子类时,抛出该异常。IllegalArgumentException抛出的异常表明向方法传递了一个不合法或不正确的参数。IllegalMonitorStateException抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。IllegalStateException在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。IllegalThreadStateException线程没有处于请求操作所要求的适当状态时抛出的异常。IndexOutOfBoundsException指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。NegativeArraySizeException如果应用程序试图创建大小为负的数组,则抛出该异常。NullPointerException当应用程序试图在需要对象的地方使用 null 时,抛出该异常NumberFormatException当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。SecurityException由安全管理器抛出的异常,指示存在安全侵犯。StringIndexOutOfBoundsException此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。UnsupportedOperationException当不支持请求的操作时,抛出该异常。 下面的表中列出了 Java 定义在 java.lang 包中的检查性异常类。 异常描述ClassNotFoundException应用程序试图加载类时,找不到相应的类,抛出该异常。CloneNotSupportedException当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。IllegalAccessException拒绝访问一个类的时候,抛出该异常。InstantiationException当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。InterruptedException一个线程被另一个线程中断,抛出该异常。NoSuchFieldException请求的变量不存在NoSuchMethodException请求的方法不存在
huc_逆天 2021-01-08 14:08:25 0 浏览量 回答数 0

回答

JAVA写RSA加密,私钥都是一样的,公钥每次加密的结果不一样跟对数据的padding(填充)有关。 1、Padding (填充)属性定义元素边框与元素内容之间的空间。 2、padding 简写属性在一个声明中设置所有内边距属性。设置所有当前或者指定元素内边距属性。该属性可以有1到4个值。 3、当元素的 Padding(填充)(内边距)被清除时,所"释放"的区域将会受到元素背景颜色的填充。 4、单独使用填充属性是在一个声明中设置元素的所内边距属性。缩写填充属性也可以使用,一旦改变一个数值,则padding对应的距离都会改变。
行者武松 2019-12-02 01:26:36 0 浏览量 回答数 0

问题

Java技术1000问(3)【精品问答】

为了方便Java开发者快速找到相关技术问题和答案,开发者社区策划了Java技术1000问内容,包含最基础的Java语言概述、数据类型和运算符、面向对象等维度内容。 我们会以每天至少50条的速度,增...
问问小秘 2020-06-02 14:27:10 11463 浏览量 回答数 3

问题

日志配置怎么做?

MQ 日志配置 本文档主要介绍 MQ 客户端日志的正常打印方式,MQ 客户端日志格式解析以及如何自定义 MQ 客户端日志配置。 打印 MQ 客户端日志 MQ 客户端日志在问题定位排查中扮演着非常重要的角色ÿ...
猫饭先生 2019-12-01 21:08:13 1265 浏览量 回答数 0

回答

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。 异常发生的原因有很多,通常包含以下几大类: 用户输入了非法数据。 要打开的文件不存在。 网络通信时连接中断,或者JVM内存溢出。 这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。- 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。 Exception 类的层次 所有的异常类是从 java.lang.Exception 类继承的子类。 Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。 Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。 Error 用来指示运行时环境发生的错误。 例如,JVM 内存溢出。一般地,程序不会从错误中恢复。 异常类有两个主要的子类:IOException 类和 RuntimeException 类。 在 Java 内置类中(接下来会说明),有大部分常用检查性和非检查性异常。 Java 内置异常类 Java 语言定义了一些异常类在 java.lang 标准包中。 标准运行时异常类的子类是最常见的异常类。由于 java.lang 包是默认加载到所有的 Java 程序的,所以大部分从运行时异常类继承而来的异常都可以直接使用。 Java 根据各个类库也定义了一些其他的异常,下面的表中列出了 Java 的非检查性异常。 异常 描述 ArithmeticException 当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。 ArrayIndexOutOfBoundsException 用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。 ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常。 ClassCastException 当试图将对象强制转换为不是实例的子类时,抛出该异常。 IllegalArgumentException 抛出的异常表明向方法传递了一个不合法或不正确的参数。 IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。 IllegalStateException 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。 IllegalThreadStateException 线程没有处于请求操作所要求的适当状态时抛出的异常。 IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。 NegativeArraySizeException 如果应用程序试图创建大小为负的数组,则抛出该异常。 NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常 NumberFormatException 当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。 SecurityException 由安全管理器抛出的异常,指示存在安全侵犯。 StringIndexOutOfBoundsException 此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。 UnsupportedOperationException 当不支持请求的操作时,抛出该异常。 下面的表中列出了 Java 定义在 java.lang 包中的检查性异常类。 异常 描述 ClassNotFoundException 应用程序试图加载类时,找不到相应的类,抛出该异常。 CloneNotSupportedException 当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。 IllegalAccessException 拒绝访问一个类的时候,抛出该异常。 InstantiationException 当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。 InterruptedException 一个线程被另一个线程中断,抛出该异常。 NoSuchFieldException 请求的变量不存在 NoSuchMethodException 请求的方法不存在 异常方法 下面的列表是 Throwable 类的主要方法: 序号 方法及说明 1 public String getMessage() 返回关于发生的异常的详细信息。这个消息在Throwable 类的构造函数中初始化了。 2 public Throwable getCause() 返回一个Throwable 对象代表异常原因。 3 public String toString() 使用getMessage()的结果返回类的串级名字。 4 public void printStackTrace() 打印toString()结果和栈层次到System.err,即错误输出流。 5 public StackTraceElement [] getStackTrace() 返回一个包含堆栈层次的数组。下标为0的元素代表栈顶,最后一个元素代表方法调用堆栈的栈底。 6 public Throwable fillInStackTrace() 用当前的调用栈层次填充Throwable 对象栈层次,添加到栈层次任何先前信息中。 捕获异常 使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。 try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下: try { // 程序代码 }catch(ExceptionName e1) { //Catch 块 } Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。 如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。 实例 下面的例子中声明有两个元素的一个数组,当代码试图访问数组的第三个元素的时候就会抛出一个异常。 ExcepTest.java 文件代码: // 文件名 : ExcepTest.java import java.io.*; public class ExcepTest{ public static void main(String args[]){ try{ int a[] = new int[2]; System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } System.out.println("Out of the block"); } } 以上代码编译运行输出结果如下: Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 Out of the block 多重捕获块 一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。 多重捕获块的语法如下所示: try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型3 异常的变量名3){ // 程序代码 } 上面的代码段包含了 3 个 catch块。 可以在 try 语句后面添加任意数量的 catch 块。 如果保护代码中发生异常,异常被抛给第一个 catch 块。 如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。 如果不匹配,它会被传递给第二个 catch 块。 如此,直到异常被捕获或者通过所有的 catch 块。 实例 该实例展示了怎么使用多重 try/catch。 try { file = new FileInputStream(fileName); x = (byte) file.read(); } catch(FileNotFoundException f) { // Not valid! f.printStackTrace(); return -1; } catch(IOException i) { i.printStackTrace(); return -1; } throws/throw 关键字: 如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。 也可以使用 throw 关键字抛出一个异常,无论它是新实例化的还是刚捕获到的。 下面方法的声明抛出一个 RemoteException 异常: import java.io.*; public class className { public void deposit(double amount) throws RemoteException { // Method implementation throw new RemoteException(); } //Remainder of class definition } 一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。 例如,下面的方法声明抛出 RemoteException 和 InsufficientFundsException: import java.io.*; public class className { public void withdraw(double amount) throws RemoteException, InsufficientFundsException { // Method implementation } //Remainder of class definition } finally关键字 finally 关键字用来创建在 try 代码块后面执行的代码块。 无论是否发生异常,finally 代码块中的代码总会被执行。 在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。 finally 代码块出现在 catch 代码块最后,语法如下: try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }finally{ // 程序代码 } 实例 ExcepTest.java 文件代码: public class ExcepTest{ public static void main(String args[]){ int a[] = new int[2]; try{ System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } finally{ a[0] = 6; System.out.println("First element value: " +a[0]); System.out.println("The finally statement is executed"); } } } 以上实例编译运行结果如下: Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 First element value: 6 The finally statement is executed 注意下面事项: catch 不能独立于 try 存在。 在 try/catch 后面添加 finally 块并非强制性要求的。 try 代码后不能既没 catch 块也没 finally 块。 try, catch, finally 块之间不能添加任何代码。 声明自定义异常 在 Java 中你可以自定义异常。编写自己的异常类时需要记住下面的几点。 所有异常都必须是 Throwable 的子类。 如果希望写一个检查性异常类,则需要继承 Exception 类。 如果你想写一个运行时异常类,那么需要继承 RuntimeException 类。 可以像下面这样定义自己的异常类: class MyException extends Exception{ } 只继承Exception 类来创建的异常类是检查性异常类。 下面的 InsufficientFundsException 类是用户定义的异常类,它继承自 Exception。 一个异常类和其它任何类一样,包含有变量和方法。 实例 以下实例是一个银行账户的模拟,通过银行卡的号码完成识别,可以进行存钱和取钱的操作。 InsufficientFundsException.java 文件代码: // 文件名InsufficientFundsException.java import java.io.*; //自定义异常类,继承Exception类 public class InsufficientFundsException extends Exception { //此处的amount用来储存当出现异常(取出钱多于余额时)所缺乏的钱 private double amount; public InsufficientFundsException(double amount) { this.amount = amount; } public double getAmount() { return amount; } } 为了展示如何使用我们自定义的异常类, 在下面的 CheckingAccount 类中包含一个 withdraw() 方法抛出一个 InsufficientFundsException 异常。 CheckingAccount.java 文件代码: // 文件名称 CheckingAccount.java import java.io.*; //此类模拟银行账户 public class CheckingAccount { //balance为余额,number为卡号 private double balance; private int number; public CheckingAccount(int number) { this.number = number; } //方法:存钱 public void deposit(double amount) { balance += amount; } //方法:取钱 public void withdraw(double amount) throws InsufficientFundsException { if(amount <= balance) { balance -= amount; } else { double needs = amount - balance; throw new InsufficientFundsException(needs); } } //方法:返回余额 public double getBalance() { return balance; } //方法:返回卡号 public int getNumber() { return number; } } 下面的 BankDemo 程序示范了如何调用 CheckingAccount 类的 deposit() 和 withdraw() 方法。 BankDemo.java 文件代码: //文件名称 BankDemo.java public class BankDemo { public static void main(String [] args) { CheckingAccount c = new CheckingAccount(101); System.out.println("Depositing $500..."); c.deposit(500.00); try { System.out.println("\nWithdrawing $100..."); c.withdraw(100.00); System.out.println("\nWithdrawing $600..."); c.withdraw(600.00); }catch(InsufficientFundsException e) { System.out.println("Sorry, but you are short $" + e.getAmount()); e.printStackTrace(); } } } 编译上面三个文件,并运行程序 BankDemo,得到结果如下所示: Depositing $500... Withdrawing $100... Withdrawing $600... Sorry, but you are short $200.0 InsufficientFundsException at CheckingAccount.withdraw(CheckingAccount.java:25) at BankDemo.main(BankDemo.java:13) 通用异常 在Java中定义了两种类型的异常和错误。 JVM(Java虚拟机) 异常:由 JVM 抛出的异常或错误。例如:NullPointerException 类,ArrayIndexOutOfBoundsException 类,ClassCastException 类。 程序级异常:由程序或者API程序抛出的异常。例如 IllegalArgumentException 类,IllegalStateException 类。
游客2q7uranxketok 2021-02-07 20:08:10 0 浏览量 回答数 0

回答

<pre><code>te.sd("11");</code></pre> 改成双引号   按照您的要求改了还是有问题....麻烦在给看看其他地方有没有问题? 对。改成:String a = te.sd("11"); 11 是个字符串,必须用双引号括起来。 <p>JAVA 语言要求:</p> 字符型变量,其数值用单引号括起来,如 char c = 'a'; 字符串数值用双引号括起来,如  String  s= "11"; 你定义的类 test 中的成员方法 public String sd(Srting s) {...} 要求的参数是 字符串,那么调用它的时候,参数必须是字符串,即必须是用双引号括起来的字符串,写成 :   String a = te.sd("11");   已经按照您的要求修改了...但是还是有错误,已经把错误提示贴出来了,您在看看 <p>这样的操作本身就是错的,</p> 亲,能指指正下错误吗? 感激不尽 重新编译下test类 并部署 <p>你JSP头文件呢,像这样的<%@ page language="java" contentType="text/html; charset=ISO-8859-1"<br>     pageEncoding="ISO-8859-1"%>。JSP也是servlet 你导入相应jar包没? <p>你是不是在com的包中还有一个test类,而且里面有个没有参数的sd()方法,或者你重新编译下。</p> <p>请问解决了吗,急需你的解决方案</p>  
爱吃鱼的程序员 2020-06-06 21:25:57 0 浏览量 回答数 0

回答

在Java中,常量池的概念想必很多人都听说过。这也是面试中比较常考的题目之一。在Java有关的面试题中,一般习惯通过String的有关问题来考察面试者对于常量池的知识的理解,几道简单的String面试题难倒了无数的开发者。所以说,常量池是Java体系中一个非常重要的概念。 谈到常量池,在Java体系中,共用三种常量池。分别是字符串常量池、Class常量池和运行时常量池。 本文先来介绍一下到底什么是Class常量池。 什么是Class文件 在Java代码的编译与反编译那些事儿中我们介绍过Java的编译和反编译的概念。我们知道,计算机只认识0和1,所以程序员写的代码都需要经过编译成0和1构成的二进制格式才能够让计算机运行。 我们在《深入分析Java的编译原理》中提到过,为了让Java语言具有良好的跨平台能力,Java独具匠心的提供了一种可以在所有平台上都能使用的一种中间代码——字节码(ByteCode)。 有了字节码,无论是哪种平台(如Windows、Linux等),只要安装了虚拟机,都可以直接运行字节码。 同样,有了字节码,也解除了Java虚拟机和Java语言之间的耦合。这话可能很多人不理解,Java虚拟机不就是运行Java语言的么?这种解耦指的是什么? 其实,目前Java虚拟机已经可以支持很多除Java语言以外的语言了,如Groovy、JRuby、Jython、Scala等。之所以可以支持,就是因为这些语言也可以被编译成字节码。而虚拟机并不关心字节码是有哪种语言编译而来的。 Java语言中负责编译出字节码的编译器是一个命令是javac。 javac是收录于JDK中的Java语言编译器。该工具可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。 如,我们有以下简单的HelloWorld.java代码: public class HelloWorld { public static void main(String[] args) { String s = "Hollis"; } } 通过javac命令生成class文件: javac HelloWorld.java 生成HelloWorld.class文件:  如何使用16进制打开class文件:使用 vim test.class ,然后在交互模式下,输入:%!xxd 即可。 可以看到,上面的文件就是Class文件,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。 要想能够读懂上面的字节码,需要了解Class类文件的结构,由于这不是本文的重点,这里就不展开说明了。 读者可以看到,HelloWorld.class文件中的前八个字母是cafe babe,这就是Class文件的魔数(Java中的”魔数”) 我们需要知道的是,在Class文件的4个字节的魔数后面的分别是4个字节的Class文件的版本号(第5、6个字节是次版本号,第7、8个字节是主版本号,我生成的Class文件的版本号是52,这时Java 8对应的版本。也就是说,这个版本的字节码,在JDK 1.8以下的版本中无法运行)在版本号后面的,就是Class常量池入口了。 Class常量池 Class常量池可以理解为是Class文件中的资源仓库。 Class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。 由于不同的Class文件中包含的常量的个数是不固定的,所以在Class文件的常量池入口处会设置两个字节的常量池容量计数器,记录了常量池中常量的个数。  当然,还有一种比较简单的查看Class文件中常量池的方法,那就是通过javap命令。对于以上的HelloWorld.class,可以通过 javap -v HelloWorld.class 查看常量池内容如下:  从上图中可以看到,反编译后的class文件常量池中共有16个常量。而Class文件中常量计数器的数值是0011,将该16进制数字转换成10进制的结果是17。 原因是与Java的语言习惯不同,常量池计数器是从0开始而不是从1开始的,常量池的个数是10进制的17,这就代表了其中有16个常量,索引值范围为1-16。 常量池中有什么 介绍完了什么是Class常量池以及如何查看常量池,那么接下来我们就要深入分析一下,Class常量池中都有哪些内容。 常量池中主要存放两大类常量:字面量(literal)和符号引用(symbolic references)。 字面量 前面说过,运行时常量池中主要保存的是字面量和符号引用,那么到底什么字面量? 在计算机科学中,字面量(literal)是用于表达源代码中一个固定值的表示法(notation)。几乎所有计算机编程语言都具有对基本值的字面量表示,诸如:整数、浮点数以及字符串;而有很多也对布尔类型和字符类型的值也支持字面量表示;还有一些甚至对枚举类型的元素以及像数组、记录和对象等复合类型的值也支持字面量表示法。 以上是关于计算机科学中关于字面量的解释,并不是很容易理解。说简单点,字面量就是指由字母、数字等构成的字符串或者数值。 字面量只可以右值出现,所谓右值是指等号右边的值,如:int a=123这里的a为左值,123为右值。在这个例子中123就是字面量。 int a = 123; String s = "hollis"; 上面的代码事例中,123和hollis都是字面量。 本文开头的HelloWorld代码中,Hollis就是一个字面量。 符号引用 常量池中,除了字面量以外,还有符号引用,那么到底什么是符号引用呢。 符号引用是编译原理中的概念,是相对于直接引用来说的。主要包括了以下三类常量: * 类和接口的全限定名 * 字段的名称和描述符 * 方法的名称和描述符 这也就可以印证前面的常量池中还包含一些com/hollis/HelloWorld、main、([Ljava/lang/String;)V等常量的原因了。 Class常量池有什么用 前面介绍了这么多,关于Class常量池是什么,怎么查看Class常量池以及Class常量池中保存了哪些东西。有一个关键的问题没有讲,那就是Class常量池到底有什么用。 首先,可以明确的是,Class常量池是Class文件中的资源仓库,其中保存了各种常量。而这些常量都是开发者定义出来,需要在程序的运行期使用的。 在《深入理解Java虚拟》中有这样的表述: Java代码在进行Javac编译的时候,并不像C和C++那样有“连接”这一步骤,而是在虚拟机加载Class文件的时候进行动态连接。也就是说,在Class文件中不会保存各个方法、字段的最终内存布局信息,因此这些字段、方法的符号引用不经过运行期转换的话无法得到真正的内存入口地址,也就无法直接被虚拟机使用。当虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中。关于类的创建和动态连接的内容,在虚拟机类加载过程时再进行详细讲解。 前面这段话,看起来很绕,不是很容易理解。其实他的意思就是: Class是用来保存常量的一个媒介场所,并且是一个中间场所。在JVM真的运行时,需要把常量池中的常量加载到内存中。 至于到底哪个阶段会做这件事情,以及Class常量池中的常量会以何种方式被加载到具体什么地方,会在本系列文章的后续内容中继续阐述。欢迎关注我的博客(http://www.hollischuang.com) 和公众号(Hollis),即可第一时间获得最新内容。 另外,关于常量池中常量的存储形式,以及数据类型的表示方法本文中并未涉及,并不是说这部分知识点不重要,只是Class字节码的分析本就枯燥,作者不想在一篇文章中给读者灌输太多的理论上的内容。感兴趣的读者可以自行Google学习,如果真的有必要,我也可以单独写一篇文章再深入介绍。 参考资料 《深入理解java虚拟机》 《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)
montos 2020-06-02 10:12:18 0 浏览量 回答数 0

回答

Record 应该有一个 getInt() 方法就好,不知道有没有######record.getInt("id")会报转换错误######有啊######int id = record.getInt('id');######java.lang.Long cannot be cast to java.lang.Integer at com.jfinal.plugin.activerecord.Record.getInt(Record.java:170)######idint(20) NOT NULL AUTO_INCREMENT 这句被你改成 idint(5) NOT NULL AUTO_INCREMENT, 错误还在吗? 一般是 int(11)######错误还在######jfinal诸如getInt(),getDouble()和jdbc中ResultSet的getInt()不同,后者你这样用可以,他直接以int返回。但是前者实际上是(Integer)getObject()的封装,而getObject()是返回默认的类型,所以mysql int默认是返回Long类型的,你这样就错了。所以解决方法是getLong("columnname")。 ######回复 @nginx困惑 : 我好像说错了,不同数据库sql类型到java类型应该是一样的,mysql 的int应该是对应java的int.bigint才是long。而且jfinal的源码上也标明了说getInt()获取mysql的int ,smallint等。######回复 @nginx困惑 : 这个不同数据库默认类型不一样的,你只能试试了。而且现在orm只是为了面向对象操作数据库,一般很少跨数据库的。你的数据库又不会变来变去。######回复 @Burning_BL :我数据库定义的是int,返回的是long,这个我取列是知道数据库类型,但像我现在遇到的问题,我只知道数据库定义是int型,但我不知道数据库返回的会不会是Long型的。######回复 @nginx困惑 : 没办法的,jfinal是这样封装的。id一般都用Long的,而且你取列的时候肯定知道是什么sql类型,然后用对应的java类型接收就行。比如如果sql是double,float,你就用Double,如果是decimal,就用BigDecimal,具体对应方式请百度。######因为我mysql数据库定义的是int类型,mysql返回long超出了我预知的范围######     mysql 数据库字段设置为 int(5),单纯取数据应该是 Integer 型,但 sql 语句可以导致这个字段值会变成 Long,例如: select sum(id).....,又如 select count(id),对 int 型字段进行运算返回了Long型值是为了防止数值溢出。     JFinal仅仅是从JDBC的ResultSet中取值,并没有对数据进行转换(Blob、Clob灰型除外),所以弄清楚JDBC返回了什么类型就可以。     贴出你的 sql 语句 ######如果能够灵活转换就好。######SQL语句 : Record accountByEmail = Db.findFirst("select * from account where email=?",email);######我也遇到了,这个 record.getInt("id") 返回的数据,听你们说的,不是我们能确定的。。######解决方法是将接收值设置为Long吗?###### 引用来自“hanzhankang”的答案 解决方法是将接收值设置为Long吗? 请看这里: http://www.oschina.net/question/924197_128359
爱吃鱼的程序员 2020-06-02 14:14:32 0 浏览量 回答数 0

回答

Record 应该有一个 getInt() 方法就好,不知道有没有######record.getInt("id")会报转换错误######有啊######int id = record.getInt('id');######java.lang.Long cannot be cast to java.lang.Integer at com.jfinal.plugin.activerecord.Record.getInt(Record.java:170)######idint(20) NOT NULL AUTO_INCREMENT 这句被你改成 idint(5) NOT NULL AUTO_INCREMENT, 错误还在吗? 一般是 int(11)######错误还在######jfinal诸如getInt(),getDouble()和jdbc中ResultSet的getInt()不同,后者你这样用可以,他直接以int返回。但是前者实际上是(Integer)getObject()的封装,而getObject()是返回默认的类型,所以mysql int默认是返回Long类型的,你这样就错了。所以解决方法是getLong("columnname")。 ######回复 @nginx困惑 : 我好像说错了,不同数据库sql类型到java类型应该是一样的,mysql 的int应该是对应java的int.bigint才是long。而且jfinal的源码上也标明了说getInt()获取mysql的int ,smallint等。######回复 @nginx困惑 : 这个不同数据库默认类型不一样的,你只能试试了。而且现在orm只是为了面向对象操作数据库,一般很少跨数据库的。你的数据库又不会变来变去。######回复 @Burning_BL :我数据库定义的是int,返回的是long,这个我取列是知道数据库类型,但像我现在遇到的问题,我只知道数据库定义是int型,但我不知道数据库返回的会不会是Long型的。######回复 @nginx困惑 : 没办法的,jfinal是这样封装的。id一般都用Long的,而且你取列的时候肯定知道是什么sql类型,然后用对应的java类型接收就行。比如如果sql是double,float,你就用Double,如果是decimal,就用BigDecimal,具体对应方式请百度。######因为我mysql数据库定义的是int类型,mysql返回long超出了我预知的范围######     mysql 数据库字段设置为 int(5),单纯取数据应该是 Integer 型,但 sql 语句可以导致这个字段值会变成 Long,例如: select sum(id).....,又如 select count(id),对 int 型字段进行运算返回了Long型值是为了防止数值溢出。     JFinal仅仅是从JDBC的ResultSet中取值,并没有对数据进行转换(Blob、Clob灰型除外),所以弄清楚JDBC返回了什么类型就可以。     贴出你的 sql 语句 ######如果能够灵活转换就好。######SQL语句 : Record accountByEmail = Db.findFirst("select * from account where email=?",email);######我也遇到了,这个 record.getInt("id") 返回的数据,听你们说的,不是我们能确定的。。######解决方法是将接收值设置为Long吗?###### 引用来自“hanzhankang”的答案 解决方法是将接收值设置为Long吗? 请看这里: http://www.oschina.net/question/924197_128359
黄二刀 2020-05-27 10:09:17 0 浏览量 回答数 0

回答

java是开源的,可以直接看源码。而且对于一个java程序员来说,JDK里面的集合框架是必看的。HashSet 源码:定义public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.SerializableHashSet 内部使用了 HashMap:private transient HashMap<E,Object> map;如果使用一个已经有的集合来初始化 HashSet:默认的加载因子为 0.75。这个数值已常量 DEFAULT_LOAD_FACTOR 的方式定义在 HashMap 中。现在重点来了,添加元素:/** * Implements Map.put and related methods * * @param hash hash for key * @param key the key * @param value the value to put * @param onlyIfAbsent if true, don't change existing value * @param evict if false, the table is in creation mode. * @return previous value, or null if none */ final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { Node<K,V> e; K k; if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; else if (p instanceof TreeNode) e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); else { for (int binCount = 0; ; ++binCount) { if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }看中间部分代码。如果key相同,则新value替换旧的。否则继续找next。如果hash不同,则肯定不同;如果hash相同,则不一定相同。相对于直接比较 key 的容器,HashMap 无疑是速度快不少。
蛮大人123 2019-12-02 01:55:08 0 浏览量 回答数 0

回答

您可以使用阿里云云数据库RDS的数据库实例来存储应用中需持久保存的数据。本文以给基于Spring Boot框架开发的Java应用添加RDS MySQL数据库为例,展示如何为Java应用添加数据库并验证应用与数据库是否连接。 环境变量 Web+会将数据库连接的相关信息存放在环境变量中,以便应用进行读取,相关环境变量请参考下表。 变量名 变量值 变量说明 WP_RDS_ENGINE MySQL RDS数据库引擎 WP_RDS_CONNECTION_ADDRESS rm-***.mysql.rds.aliyuncs.com RDS内网连接地址 WP_RDS_PORT 3306 RDS端口号 WP_RDS_ACCOUNT_NAME webplus RDS数据库账号名称 WP_RDS_ACCOUNT_PASSWORD 自定义 RDS账号密码 WP_RDS_DATABASE webplus RDS数据库 添加依赖和修改配置文件 打开SpringBoot工程中的pom.xml文件,添加JDBC依赖和MySQL依赖。 ​ org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java 打开工程中的application.properties配置文件,您可以按以下方式使用环境变量配置JDBC的连接参数,其中NONE可以修改为默认数值。 ​spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://${WP_RDS_CONNECTION_ADDRESS:NONE}:${WP_RDS_PORT:3306}/rdsitem?useUnicode=true&characterEncoding=utf-8 spring.datasource.username=${WP_RDS_ACCOUNT_NAME:NONE} spring.datasource.password=${WP_RDS_ACCOUNT_PASSWORD:NONE}​ 连接数据库 修改依赖和配置后,启动应用时SpringBoot会根据配置文件自动连接数据库,下面的代码片段展示了如何在Web+中的应用访问数据库。 ​ @Autowired private JdbcTemplate jdbcTemplate; // 从数据库item中查询 public List<Item> fetchItems() { final String sql="select id,title,completed from item"; RowMapper<Item> rowMapper=new BeanPropertyRowMapper<>(Item.class); return jdbcTemplate.query(sql, rowMapper); }​ 其中,Item类定义如下: ​public class Item { private String id; private String title; private boolean completed; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public boolean getCompleted() { return completed; } public void setCompleted(boolean completed) { this.completed = completed; } Item() { } @Override public String toString() { return id + " " + title + " " + completed; } }​
1934890530796658 2020-03-23 14:18:26 0 浏览量 回答数 0

回答

先补充一下概念:Java 内存模型中的可见性、原子性和有序性。可见性:  可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。  可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。比如 volatile int a = 0;之后有一个操作 a++;这个变量a具有可见性,但是a++ 依然是一个非原子操作,也就是这个操作同样存在线程安全问题。  在 Java 中 volatile、synchronized 和 final 实现可见性。原子性:  原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。java的concurrent包下提供了一些原子类,我们可以通过阅读API来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。  在 Java 中 synchronized 和在 lock、unlock 中操作保证原子性。有序性:  Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行。下面内容摘录自《Java Concurrency in Practice》:  下面一段代码在多线程环境下,将存在问题。复制代码+ View code1 /** 2 * @author zhengbinMac 3 */ 4 public class NoVisibility { 5 private static boolean ready; 6 private static int number; 7 private static class ReaderThread extends Thread { 8 @Override 9 public void run() {10 while(!ready) {11 Thread.yield();12 }13 System.out.println(number);14 }15 }16 public static void main(String[] args) {17 new ReaderThread().start();18 number = 42;19 ready = true;20 }21 }复制代码  NoVisibility可能会持续循环下去,因为读线程可能永远都看不到ready的值。甚至NoVisibility可能会输出0,因为读线程可能看到了写入ready的值,但却没有看到之后写入number的值,这种现象被称为“重排序”。只要在某个线程中无法检测到重排序情况(即使在其他线程中可以明显地看到该线程中的重排序),那么就无法确保线程中的操作将按照程序中指定的顺序来执行。当主线程首先写入number,然后在没有同步的情况下写入ready,那么读线程看到的顺序可能与写入的顺序完全相反。  在没有同步的情况下,编译器、处理器以及运行时等都可能对操作的执行顺序进行一些意想不到的调整。在缺乏足够同步的多线程程序中,要想对内存操作的执行春旭进行判断,无法得到正确的结论。  这个看上去像是一个失败的设计,但却能使JVM充分地利用现代多核处理器的强大性能。例如,在缺少同步的情况下,Java内存模型允许编译器对操作顺序进行重排序,并将数值缓存在寄存器中。此外,它还允许CPU对操作顺序进行重排序,并将数值缓存在处理器特定的缓存中。二、Volatile原理  Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。  在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。  当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。  而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步。当一个变量定义为 volatile 之后,将具备两种特性:  1.保证此变量对所有的线程的可见性,这里的“可见性”,如本文开头所述,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存(详见:Java内存模型)来完成。  2.禁止指令重排序优化。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。volatile 性能:  volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。
wangccsy 2019-12-02 01:48:10 0 浏览量 回答数 0

回答

多线程带来的风险有三种,安全性问题,活跃性问题,性能问题。首先,安全性问题,《Java并发编程》一书中对类的线程安全的定义是:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程将如何交替执行,并且在主调用代码中不需要任何额外的同步或者协同,这个类都能表现正确的行为,那么这个类就是线程安全的。相反这段描述的另一面就是线程不安全的,即可能出现某个类的行为与其规范的不一致。例如:数值序列生成器,简单的共享变量++操作。 public class UnsafeSequence{ private int value; public int getNext(){ return value++; } }这段代码的getNext如果执行时机不对,那么两个线程在调用getNext时会得到相同的值,因为value++操作本身包含三种独立的操作,读value,value+1,写入value,这三个动作如果在多个线程之间交替执行,就可能导致最终的数据不合常理。也就是说这段代码存在安全性问题。其次,活跃性问题是指当某个操作无法继续执行下去时就会发生活跃性问题,如锁机制下线程死锁的问题。最后,性能问题,多线程程序中,线程的调度,频繁的上下文切换等操作会带来极大的开销,也是编写多线程应用需要权衡的问题。
蛮大人123 2019-12-02 02:22:41 0 浏览量 回答数 0

回答

定义一个对象存一下,应该满足题意吧,参考代码如下: import java.util.ArrayList; import java.util.List; /** * @ClassName: Entry * @Description: TODO * @author jiang * @date 2018年8月22日 下午1:47:46 * */ public class Entry { /** * 数值 */ private Integer value; /** * 位置 */ private List<Integer[]> index; public Integer getValue() { return value; } public void setValue(Integer value) { this.value = value; } public List<Integer[]> getIndex() { return index; } public void setIndex(List<Integer[]> index) { this.index = index; } public static void main(String[] args) { // 出力矩阵数字列表 List<Entry> entryList = new ArrayList<Entry>(); // 循环出力矩阵,假如当前是x Integer x = 14; // 单个数字 Entry entry = null; /****** start 在这里包一个矩阵循环,给x赋值,同时也是index的值 ***************************/ // 数字列表取值或新建 for (Entry en : entryList) { if (!en.getValue().equals(x)) { continue; } entry = en; break; } if (entry == null) { entry = new Entry(); entry.setValue(x); entryList.add(entry); } // 放入数字位置 Integer[] index = new Integer[2]; index[0] = 2; index[1] = 3; List<Integer[]> indexList = entry.getIndex(); if (indexList == null) { indexList = new ArrayList<Integer[]>(); entry.setIndex(indexList); } indexList.add(index); /***** end ****************************/ // 最后得到一个entry的列表,entry有数字和位置列表,value是数字,list的长度就是出现的数量,之后就随便操作了 } }
痞子姜 2019-12-02 01:31:16 0 浏览量 回答数 0

回答

<pre><code>A.java:7: 错误: 不兼容的类型: 从int转换到byte可能会有损失 byte b1 = 0xAA; ^ A.java:9: 错误: 不兼容的类型: 从int转换到short可能会有损失 short s1 = 0xAAAA; ^ 2 个错误 编译时候,进行检查,看赋值大小是否超过变量的类型所容纳的范围。 如果超过,报错:从int转换到byte可能会有损失, 如果没超过,编译通过 变量的类型 该变量类型所容纳的范围 ( MAX_VALUE 十进制)初始值( 10 进制)初始值( 16进制)byte1271700xAAshort32767436900xAAAAint214748364728633158990xAAAABBBBlong9223372036854775807122978481477578173090xAAAABBBBCCCCDDDDL 从表中看出,两处(byte b1 = 0xAA; 和 short s1=0xAAAA;) 没有通过编译的原因,都是因为初始赋的值超过变量的类型所容纳的范围。长型 变量 l 的初始化值 0xAAAABBBBCCCCDDDD 同样也超过了长型变量的最大值。只是因为数值的尾部加了一个L,避免了上述的检查。但后来调用方法 System.out.println(l);, 就会看到一个“垃圾”输出: -6148895925951734307。整型变量 i  的初始化,编译时也没有检查(可能是用了16进制形式的缘故?)。从表中看出,0xAAAABBBB 已经超出了int型变量的最大正整数值:2147483647。所以“初始化”之后,若调用方法 System.out.println(i);, 就会看到一个“垃圾”输出: -1431651397。如果用10进制形式初始化: int i = 2863315899; 同样逃不掉编译器的眼睛: A.java:6: 错误: 过大的整数: 2863315899 int i= 2863315899; ^ 1 个错误   回复 <a class="referer" target="_blank">@pinitianjie</a> : 值得深思/详谈。 编译器不对超限的int和long进行检查,这个是为什么 <p>Java 中都是有符号数。最高位表示正/符,其余位是有效位。最高位是1时,要以补码进行计算</p> 贴一个JLS 中的英文: An integer literal is of type long if it is suffixed with an ASCII letter L or l (ell); otherwise it is of type int. int i = 0XAAAABBBB; byte b = 0XA; short s = 0XAAA; 正常 0XAA 十进制为170,大于byte的最大值127 0XAAAA 被认为是int值,且大于了short的最大值32767,不能赋值为short。 long 是64位且声明了该16进制数为long型,且最高位为1进行逆补码运算后结果为-6148895925951734307 这错误鼠标悬浮应该会告诉你吧 <p>你连基本类型的最大值和最小值都不知道,建议</p> 大佬请讲解一下。定义一个short类型字段,怎么set值给他
爱吃鱼的程序员 2020-06-08 11:16:43 0 浏览量 回答数 0

回答

Record应该有一个getInt()方法就好,不知道有没有######record.getInt("id")会报转换错误######有啊######intid=record.getInt('id');######java.lang.Longcannotbecasttojava.lang.Integeratcom.jfinal.plugin.activerecord.Record.getInt(Record.java:170)######idint(20)NOTNULLAUTO_INCREMENT这句被你改成idint(5)NOTNULLAUTO_INCREMENT,错误还在吗? 一般是int(11)######错误还在######jfinal诸如getInt(),getDouble()和jdbc中ResultSet的getInt()不同,后者你这样用可以,他直接以int返回。但是前者实际上是(Integer)getObject()的封装,而getObject()是返回默认的类型,所以mysqlint默认是返回Long类型的,你这样就错了。所以解决方法是getLong("columnname")。######回复<aclass="referer"target="_blank">@nginx困惑:我好像说错了,不同数据库sql类型到java类型应该是一样的,mysql的int应该是对应java的int.bigint才是long。而且jfinal的源码上也标明了说getInt()获取mysql的int,smallint等。######回复<aclass="referer"target="_blank">@nginx困惑:这个不同数据库默认类型不一样的,你只能试试了。而且现在orm只是为了面向对象操作数据库,一般很少跨数据库的。你的数据库又不会变来变去。######回复<aclass="referer"target="_blank">@Burning_BL:我数据库定义的是int,返回的是long,这个我取列是知道数据库类型,但像我现在遇到的问题,我只知道数据库定义是int型,但我不知道数据库返回的会不会是Long型的。######回复<aclass="referer"target="_blank">@nginx困惑:没办法的,jfinal是这样封装的。id一般都用Long的,而且你取列的时候肯定知道是什么sql类型,然后用对应的java类型接收就行。比如如果sql是double,float,你就用Double,如果是decimal,就用BigDecimal,具体对应方式请百度。######因为我mysql数据库定义的是int类型,mysql返回long超出了我预知的范围######   mysql数据库字段设置为int(5),单纯取数据应该是Integer型,但sql语句可以导致这个字段值会变成Long,例如:selectsum(id).....,又如selectcount(id),对int型字段进行运算返回了Long型值是为了防止数值溢出。   JFinal仅仅是从JDBC的ResultSet中取值,并没有对数据进行转换(Blob、Clob灰型除外),所以弄清楚JDBC返回了什么类型就可以。   贴出你的sql语句######如果能够灵活转换就好。######SQL语句:RecordaccountByEmail=Db.findFirst("select*fromaccountwhereemail=?",email);######我也遇到了,这个<spanstyle="color:#FF6600;font-family:微软雅黑,Verdana,sans-serif,宋体;line-height:normal;background-color:#FFFFFF;">record.getInt("id")返回的数据,听你们说的,不是我们能确定的。。######解决方法是将接收值设置为Long吗?######<divclass="ref"> 引用来自“hanzhankang”的答案<divclass="ref_body">解决方法是将接收值设置为Long吗?<divclass="a_body"> 请看这里: <arel="nofollow">http://www.oschina.net/question/924197_128359
爱吃鱼的程序员 2020-06-22 23:10:25 0 浏览量 回答数 0

回答

签名机制 ROA风格API签名包含两部分:公共请求头(HTTP 协议 header 参数和阿里云协议 Header 参数)和 CanonicalizedResource(规范资源)。推荐尽量使用SDK接入,用户可以不关注签名细节 。 名称 描述 Authorization 用于验证请求合法性的认证信息,采用 acs AccessKeyId:signature 格式。 Content-Length RFC 2616 中定义的 HTTP 请求内容长度。 Content-Type RFC 2616 中定义的 HTTP 请求内容类型。 Content-MD5 HTTP 协议消息体的 128-bit MD5 散列值转换成 BASE64 编码的结果。为了防止所有请求被篡改,建议所有请求都附加该信息。 Date 描述请求时间,GMT 格式,如: Wed, 26 Aug. 2015 17:01:00 GMT。 Accept 客户端需要的返回值类型,只支持 application/json Host 访问 Host 值,例如:mt.cn-hangzhou.aliyuncs.com。 x-acs-signature-nonce 唯一随机数,用于防止网络重放攻击。用户在不同请求中要使用不同的随机数值。 x-acs-signature-method 签名方法,目前只支持 HMAC-SHA1。 x-acs-version API版本, 如果不填写,服务端默认取最高版本 签名计算方法 ROA风格的API请求使用标准的Authorization头来签名自己的请求,请求格式如下: Authorization: acs AccessKeyId:Signature 计算body的MD5值,然后再对其进行base64编码,编码后的值设置到 Header中。 使用请求中的Header参数构造规范化的Header字符串 headerStringToSign = HTTP-Verb + "\n" + //HTTP_Verb只支持POST Accept + “\n” + //Accept为application/json Content-MD5 + "\n" + //第1步中计算出来的MD5值 Content-Type + "\n" + //Content-Type值为application/json;chrset=utf-8 Date + "\n" + //Date值为GMT时间 “x-acs-signature-method:HMAC-SHA1\n” + “x-acs-signature-nonce:” + ${x-acs-signature-nonce} + "\n" + “x-acs-version:2019-01-02" + "\n"; CanonicalizedResource 表示客户想要访问资源的规范描述,需要将子资源和qurey一同按照字典序,从小到大排列并以 & 为分隔符生成子资源字符串(?后的所有参数),示例如下(alimt所有请求都不带参数)。 resourceStringToSign = URI; 将上两步构造的规范化字符串按照下面的规则构造成待签名的字符串。 stringToSign = headerStringToSign + resourceStringToSign; 按照 RFC2104的定义,计算待签名字符串StringToSign的 HMAC 值,按照 Base64 编码规则把上面的 HMAC 值编码成字符串,并在前面加上AccessKeyId,即得到签名值(Authorization),示例如下: Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) ) Authorization = "acs " + AccessKeyId + ":" + Signature 代码示例(java) import sun.misc.BASE64Encoder; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.UUID; public class Sender { /* * 计算MD5+BASE64 */ public static String MD5Base64(String s) { if (s == null) return null; String encodeStr = ""; byte[] utfBytes = s.getBytes(); MessageDigest mdTemp; try { mdTemp = MessageDigest.getInstance("MD5"); mdTemp.update(utfBytes); byte[] md5Bytes = mdTemp.digest(); BASE64Encoder b64Encoder = new BASE64Encoder(); encodeStr = b64Encoder.encode(md5Bytes); } catch (Exception e) { throw new Error("Failed to generate MD5 : " + e.getMessage()); } return encodeStr; } /* * 计算 HMAC-SHA1 */ public static String HMACSha1(String data, String key) { String result; try { SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signingKey); byte[] rawHmac = mac.doFinal(data.getBytes()); result = (new BASE64Encoder()).encode(rawHmac); } catch (Exception e) { throw new Error("Failed to generate HMAC : " + e.getMessage()); } return result; } /* * 获取时间 */ public static String toGMTString(Date date) { SimpleDateFormat df = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.UK); df.setTimeZone(new java.util.SimpleTimeZone(0, "GMT")); return df.format(date); } /* * 发送POST请求 */ public static String sendPost(String url, String body, String ak_id, String ak_secret) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); /* * http header 参数 */ String method = "POST"; String accept = "application/json"; String content_type = "application/json;chrset=utf-8"; String path = realUrl.getFile(); String date = toGMTString(new Date()); String host = realUrl.getHost(); // 1.对body做MD5+BASE64加密 String bodyMd5 = MD5Base64(body); String uuid = UUID.randomUUID().toString(); String stringToSign = method + "\n" + accept + "\n" + bodyMd5 + "\n" + content_type + "\n" + date + "\n" + "x-acs-signature-method:HMAC-SHA1\n" + "x-acs-signature-nonce:" + uuid + "\n" + "x-acs-version:2019-01-02\n" + path; // 2.计算 HMAC-SHA1 String signature = HMACSha1(stringToSign, ak_secret); // 3.得到 authorization header String authHeader = "acs " + ak_id + ":" + signature; // 打开和URL之间的连接 URLConnection conn = realUrl.openConnection(); // 设置通用的请求属性 conn.setRequestProperty("Accept", accept); conn.setRequestProperty("Content-Type", content_type); conn.setRequestProperty("Content-MD5", bodyMd5); conn.setRequestProperty("Date", date); conn.setRequestProperty("Host", host); conn.setRequestProperty("Authorization", authHeader); conn.setRequestProperty("x-acs-signature-nonce", uuid); conn.setRequestProperty("x-acs-signature-method", "HMAC-SHA1"); conn.setRequestProperty("x-acs-version", "2019-01-02"); // 版本可选 // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // 获取URLConnection对象对应的输出流 out = new PrintWriter(conn.getOutputStream()); // 发送请求参数 out.print(body); // flush输出流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 InputStream is; HttpURLConnection httpconn = (HttpURLConnection) conn; if (httpconn.getResponseCode() == 200) { is = httpconn.getInputStream(); } else { is = httpconn.getErrorStream(); } in = new BufferedReader(new InputStreamReader(is)); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("发送 POST 请求出现异常!" + e); e.printStackTrace(); } // 使用finally块来关闭输出流、输入流 finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return result; } }
景凌凯 2020-04-05 23:32:31 0 浏览量 回答数 0

问题

Java 序列化的高级认识 热:报错

简介: 如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件。那你最好再阅读该篇文章,文章对序列化进行了更深一步的讨论,用实际的例子代码讲述了序列化的高级认识&...
kun坤 2020-06-07 21:41:37 0 浏览量 回答数 1

回答

当然不是,是jms服务,用于java程序的通讯,而不是显示消息给人看,不是人机交互。消息服务是指,两个或者多个客户机能够通过发送和接受消息(以对等的方式)通信。消息是通过消息服务器有一个客户机发送到另一个客户机的"一块"数据,可以是文本的,也可是数值的,如果客户机是Java应用程序,数据还可以包括对象。其中客户机不需要同时运行。 使用消息服务的原因: 1.松散耦合但是高内聚。使用消息服务的客户机不需要实现通用接口,不需要了解对方。消息服务提供了标准接口。 2.不直接通信。客户机不直接对话,而通过中间媒介,消息服务扮演 缓冲区,并提供 安全控制。 3.保证消息传递。 JMS的提供者保持消息持久,直到客户机接受为止。 4.异步通信。 5.一对多、多对多和多对一通信。 JMS(Java 消息服务)是一组标准的API,能够用于访问多种消息服务器。使用JMS,可以使用一样的API访问IBM的MQSeries、JBossMQ等消息服务。 JMS API中有很多核心概念是映射到底层的消息服务器。其中: 1.受控对象(Administered Object)。它们是由管理者创建的供JMS客户机使用的对象。如 连接工厂(Connection Factory),它们用于与底层的消息服务器和目标(队列和主题)进行连接(注:不太理解,可能错了。)。管理通过JNDI对他们进行管理。JMS提供了JMS客户机和实际JMS提供者之间的缓冲区。JBoss就是这些对象的管理者。 2.JMS提供者。实现了JMS接口的消息服务器。(如 JBossMQ消息服务器)。 3.JMS客户机。消息的生产者和消费者。由于是对等的通信机制,所以没有客户机和服务器的概念。JMS既可以是消息创建者又是消息接收者。 4.消息(Message)。JMS客户机之间传送的一条条消息。 传统的消息服务一般支持点对点通信和发布/订阅通信两种通信模式的一种。JMS API 两种都支持。 Point-To-Point 点对点通信模式,有一个中心队列作为发布的目标(受控对象)。一个或多个消息生产者可以发送消息到这个队列。然后被消息的消费者选取。 Pub/Sub 发布/订阅通信模式是基于主题(Topic)概念的。主题是消息的发布目标(受控对象)。它和队列的不同就在于,可以有多个发送消息和接收消息的客户机,每个主题可以有多个发布者和多个订阅者。 JMS API JMS API是在javax.jms包中定义的。要使用JMS API 需要创建一个提供连接对象的连接工厂。连接对象提供与消息服务器的链接。链接被用来创建会话,会话被用来创建消息,消息通过消息的生产者发送到目标(队列或主题),然后消息传递到消息消费者。 JMS Parent PTP Domain Pub/Sub Domain ConnectionFactory QueueConnectionFactory TopicConnectionFactory Connection QueueConnection TopicConnection Destination Queue Topic Session QueueSession TopicSession MessageProducer QueueSender TopicPublisher MessageConsumer QueueReceiver TopicSubscriber 以下是对这些接口的简单描述: 1.连接工厂(Connection Factory) 是客户机用来创建与JMD提供者的链接的对象。它是受控对象,可以通过JNDI查找。JMS API定义了两种类型的连接工厂。 QueueConnectionFactory 和 TopicConnectionFactory 2.连接(Connection) 连接对象是和JMS提供者通信的媒介。这个通信的具体实现依赖于JMS提供者。除了通用的借口,还有基于队列(QueueConnection)和基于主题(TopicConnection)专用接口。 3.会话(Session) 用于创建消息的生产者、消费者和消息。它们都是单线程,能参加事务。有QueueSession和TopicSession。 4.消息(Message) 消息是消息服务器在客户端之间发送的一条条信息。有五种接口,不同的类型消息。1. StreamMessage -- Java原始值的数据流 2. MapMessage--一组名/值对 3.TextMessage--一个字符串对象 4. ObjectMessage--一个序列化的 Java对象 5.BytesMessage--一个未解释字节的数据流。 消息由以下几部分组成: 消息头(header):JMS消息头包含了许多字段,它们是消息发送后由JMS提供者或消息发送者产生,用来表示消息、设置优先权和失效时间等等,并且为消息确定路由。 属性(property):由消息发送者产生,用来添加删除消息头以外的附加信息。 消息体(body):由消息发送者产生。 5.目标(Destination) 目标是受控对象。在JMS中表示一个队列或者一个主题。 6.消息生产者(MessageProducer) 是用于将消息发送到目标的对象,由会话对象创建,有QueueSender、TopicPublisher. 7.消息消费者(MessageConsumer) 是由会话对象创建,用于从目标获取消息,有QueueReceiver、TopicSubscriber 一个JMS应用是几个JMS 客户端交换消息,开发JMS客户端应用由以下几步构成: 1) 用JNDI 得到ConnectionFactory对象; 2) 用ConnectionFactory创建Connection 对象; 3) 用Connection对象创建一个或多个JMS Session; 4) 用JNDI 得到目标队列或主题对象,即Destination对象; 5) 用Session 和Destination 创建MessageProducer和MessageConsumer; 6) 通知Connection 开始传递消息。 消息生产者程序如下 import java.io.*; mport javax.jms.*; import javax.naming.*; public class Sender { public static void main(String[] args) { new Sender().send(); } public void send() { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { //Prompt for JNDI names System.out.println("Enter ConnectionFactory name:"); String factoryName = reader.readLine(); System.out.println("Enter Destination name:"); String destinationName = reader.readLine(); //Look up administered objects InitialContext initContext = new InitialContext(); ConnectionFactory factory = (ConnectionFactory) initContext.lookup(factoryName); Destination destination = (Destination) initContext.lookup(destinationName); initContext.close(); //Create JMS objects Connection connection = factory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer sender = session.createProducer(queue); //Send messages String messageText = null; while (true) { System.out.println("Enter message to send or 'quit':"); messageText = reader.readLine(); if ("quit".equals(messageText)) break; TextMessage message = session.createTextMessage(messageText); sender.send(message); } //Exit System.out.println("Exiting..."); reader.close(); connection.close(); System.out.println("Goodbye!"); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } } 消息消费者程序如下 import java.io.*; import javax.jms.*; import javax.naming.*; public class Receiver implements MessageListener { private boolean stop = false; public static void main(String[] args) { new Receiver().receive(); } public void receive() { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); try { //Prompt for JNDI names System.out.println("Enter ConnectionFactory name:"); String factoryName = reader.readLine(); System.out.println("Enter Destination name:"); String destinationName = reader.readLine(); reader.close(); //Look up administered objects InitialContext initContext = new InitialContext(); ConnectionFactory factory = (ConnectionFactory) initContext.lookup(factoryName); Destination destination = (Destination) initContext.lookup(destinationName); initContext.close(); //Create JMS objects Connection connection = factory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer receiver = session.createConsumer(queue); receiver.setMessageListener(this); connection.start(); //Wait for stop while (!stop) { Thread.sleep(1000); } //Exit System.out.println("Exiting..."); connection.close(); System.out.println("Goodbye!"); } catch (Exception e) { e.printStackTrace(); System.exit(1); } } public void onMessage(Message message) { try { String msgText = ((TextMessage) message).getText(); System.out.println(msgText); if ("stop".equals(msgText)) stop = true; } catch (JMSException e) { e.printStackTrace(); stop = true; } } }
蛮大人123 2019-12-02 02:30:01 0 浏览量 回答数 0

回答

本文列举了Web应用托管服务的API的公共请求头和公共返回头信息。 公共请求头部 公共请求参数是指每个接口都需要使用到的请求参数。 参数名称 示例 是否必选 说明 Authorization acs : 是 用于验证请求合法性的认证信息,采用 AccessKeyId:Signature 的形式。 Content-Length 0 是 RFC 2616 中定义的 HTTP 请求内容长度。 Content-Type application/json 是 RFC 2616 中定义的 HTTP 请求内容类型。 Content-MD5 0e30656xxxxxxxxx0bc6f70bbdfe 是 HTTP 协议消息体的 128-bit MD5 散列值转换成 BASE64 编码的结果。为了防止所有请求被篡改,建议所有请求都附加该信息。 Date Fri, 16 Aug 2019 11:18:47 GMT 是 请求的构造时间,目前只支持 GMT 格式。如果与 MNS 的服务器时间前后差异超过 15 分钟将返回本次请求非法。 Host webplus.cn-hangzhou.aliyuncs.com 是 请求的服务地址,例如:webplus.cn-hangzhou.aliyuncs.com。 Accept application/json 是 客户端需要的返回值类型,支持 application/json 和 application/xml。 x-acs-version 1.0 是 API 版本号。目前版本号为 2019-03-20。 x-acs-region-id cn-hangzhou 是 地域ID。 x-acs-signature-nonce f63659d4-10ac-483b-99da-ea8fde61eae3 是 唯一随机数,用于防止网络重放攻击。您在不同请求间要使用不同的随机数值。 x-acs-signature-method HMAC-SHA1 是 用户签名方式,目前只支持 HMAC-SHA1。 示例 GET /pop/v1/wam/appEnv HTTP/1.1 Host: webplus.cn-hangzhou.aliyuncs.com Accept: application/json UserAgent : Apache-HttpClient/4.5.7 (Java/1.8.0_152) x-acs-signature-nonce: f63659d4-10ac-483b-99da-ea8fde61eae3 Authorization: acs : x-acs-signature-version: 1.0 Date: Fri, 16 Aug 2019 11:18:47 GMT x-acs-signature-method: HMAC-SHA1 Content-Type: application/json;charset=utf-8 X-Acs-Region-Id: cn-hangzhou Content-Length: 0 公共返回头部 每次接口调用请求,无论成功与否,系统都会返回一个唯一识别码RequestId。调用API服务后返回数据采用统一格式。返回的HTTP状态码为 2xx,代表调用成功;返回的HTTP状态码为 4xx 或 5xx,代表调用失败。 XML 示例: <接口名称+response> | | 4C467B38-3910-447D-87BC-AC049166F216 | JSON 示例: { "RequestId": "4C467B38-3910-447D-87BC-AC049166F216" /* 返回结果数据 */ }
1934890530796658 2020-03-23 14:43:41 0 浏览量 回答数 0

回答

1.not null 非空约束 ①强制列不接受空值 ②例:创建表时,name varchar(6) not null, 2.unique 唯一性约束 ①约束唯一标识数据库表中的每条记录 ②unique和primary key都为数据提供了唯一性约束 ③primary key 拥有自动定义的Unique约束 ④注意:每个表中只能有一个primary key约束,但是可以有多个Unique约束 ⑤语法: 1.name int unique 2.unique(column_name) 3.CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName) 添加多个约束 4.alter table table_name add unique(column_name) 增加表中的约束 5.ALTER TABLE table_name DROP CONSTRAINT 主键名 删除约束 3.primary key约束 ①约束唯一标识数据库表中的每条记录 ②主键必须包含唯一的值 ③主键列不能为空 ④每个表都应该有个主键,但只能有一个主键 ⑤语法: 1.StudentID int not null primary key 创建学生编号为主键 2.primary key(Students) 创建学生编号为主键 3.primary key(StudentID,Email) 创建学生ID和Email为联合主键 ⑥为已存在的列创建主键 1.alter table table_name add primary key(column_name) ⑦删除主键约束 1.alter table table_name drop primary key ⑧删除主键约束 1.alter table table_name drop constraint 主键约束名 主键约束名可以使用sp_help查询 4.foreign key约束 ①一个表中的foreign key 指向另一个表的primary key ②foreign key约束用于预防破坏表之间连接的动作 ③foreign key约束也能防止非法数据插入外键列,因为它必须是指向的那个表的值之一 ④语法: 1.foreign key (column_name) references 主表名(主键列名) 创建column_name为主表名的外键 2.column_name int foreign key references 主表名(主键列名) 创建column_name为主表名的外键 3.alter table table_name                   add foreign key (列名) references 主表名(主键列名) 为已存在的列创建外键 4.alter table table_name drop constraint 外键约束名 删除外键约束(SQL Server oracle) 5.alter table table_name drop foreign key 外键约束名 删除外键约束(Mysql) 5.check 约束 ①check约束用于限制列中的值的范围 ②如果对个单个列做check约束,那么该列只可以输入特定数值 ③如果一个表定义check约束,那么此约束会在特定的列对值进行限制 ④语法: 1.StudentID int not null check (StudentID>0) 限制StudentID输入的值要大于0 (SQL Server oracle) 2.StudentID int not null, 限制StudentID输入的值要大于0 (Mysql) check (StudentID>0) 3.sex varchar(2) not null check(sex='男' or sex='女') 限制sex的性别只能是男或者女 4.alter table table_name add check(列名>0) 向已有的列加入check约束 5.alter table table_name drop constraint check约束名 删除约束 约束名可以用 sp_help table_name查看 6.default约束 ①default约束用于向列中插入默认值 ②如果没有规定其他的值,那么会将默认值添加到所有的新记录中 ③语法: 1.name varchar(10) default '张三' name默认插入张三的名字 2.systime date default gatedate() 插入时间的默认值 getetime()函数为时间的默认值 3.alter table table_name add 列名 set default '数值' 向已有列名中插入默认值 4.alter table table_name drop constraint 约束名 删除默认约束 */ ———————————————— 版权声明:本文为CSDN博主「z120270662」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/z120270662/java/article/details/79501621
徐刘根 2020-03-31 11:12:41 0 浏览量 回答数 0

问题

日志的发布历史有哪些?

2017/9 新功能 支持JDBC协议:通过SQL92标准语法对日志进行查询分析 2017/8 性能优化 对底层存储进行深度优化,分析性能提升1000倍,做到真正实时日志...
轩墨 2019-12-01 21:50:57 1618 浏览量 回答数 0

问题

Android目录结构(详解):报错

Android目录结构(详解) 下面是HelloAndroid项目在eclipse中的目录层次结构: 由上图可以看出项目的根目录下共有九个文件(夹),...
kun坤 2020-06-07 21:39:11 0 浏览量 回答数 1

回答

追加:目测代码逻辑完全没错,只是K值的问题,long类型的K值因为不断的相乘,超过long的上限值,恭喜,在某一次相乘的时候,k值duang一下变成0了,所以,换一种方法吧,题主可以自己断点测试一下,最后k是变成0的######回复 @月生无界 : 客气客气######回复 @月影南溪 : 感谢提出######数据溢出不会变0的###### 月生无界正确地说出了long 型的取值范围。特此,我将从前写的代码展示如下, 来表明JAVA不同类型的变量的取值范围: public class Limits{        public static void main(String args[]){ /* 打印六种数字基本类型变量的最大值和最小值 */   System.out.println("长型最大值 LONG_Max: " + Long.MAX_VALUE); System.out.println("长型最小值 LONG_Min: " + Long.MIN_VALUE); System.out.println("整型最大值 Int_Max: " + Integer.MAX_VALUE); System.out.println("整型最小值 Int_Min: " + Integer.MIN_VALUE); System.out.println("短型最大值 SHORT_Max: " + Short.MAX_VALUE); System.out.println("短型最小值 SHORT_Min: " + Short.MIN_VALUE); System.out.println("字节型最大值 BYTE_Max: " + Byte.MAX_VALUE); System.out.println("字节型最小值 BYTE_Min: " + Byte.MIN_VALUE); //System.out.println("浮点型最大值 FLOAT_Max: " + Float.MAX_VALUE); //System.out.println("浮点型最小值 FLOAT_Min: " + Float.MIN_VALUE); //System.out.println("双精度型最大值 DOUBLE_Max: " + Double.MAX_VALUE); //System.out.println("双精度型最小值 DOUBLE_Min: " + Double.MIN_VALUE);        } } 输出:   长型最大值 LONG_Max: 9223372036854775807 长型最小值 LONG_Min: -9223372036854775808 整型最大值 Int_Max: 2147483647 整型最小值 Int_Min: -2147483648 短型最大值 SHORT_Max: 32767 短型最小值 SHORT_Min: -32768 字节型最大值 BYTE_Max: 127 字节型最小值 BYTE_Min: -128 ..........   就拿计算阶乘为例,以下代码,可以检查JAVA 输出数据的有效性。 public class Factoria { public static void main(String args[]) { //主方法代码块开始 int iFactoria=1;    //用整型存储阶乘 long lFactoria=1; //用长型存储阶乘 for (int i=1; i<17;i++){ //用for循环语句输出1到16的阶乘    iFactoria *=i;  //将i的阶乘存入整型变量    lFactoria *=i;  //将i的阶乘存入长型变量    /* 分别输出存于整型变量和长型变量的阶乘 */    System.out.printf(" %d 的阶乘:\t %10d(int), %15d(long)\n",        i, iFactoria, lFactoria);        }    System.out.printf("最大整型:%12d, 最大长型: %d\n",        Integer.MAX_VALUE,Long.MAX_VALUE);   }  //主方法 main 代码块结束结束 }  // 类 Factoria 定义结束   输出:   1 的阶乘:                1(int),               1(long)  2 的阶乘:                2(int),               2(long)  3 的阶乘:                6(int),               6(long)  4 的阶乘:               24(int),              24(long)  5 的阶乘:              120(int),             120(long)  6 的阶乘:              720(int),             720(long)  7 的阶乘:             5040(int),            5040(long)  8 的阶乘:            40320(int),           40320(long)  9 的阶乘:           362880(int),          362880(long)  10 的阶乘:         3628800(int),         3628800(long)  11 的阶乘:        39916800(int),        39916800(long)  12 的阶乘:       479001600(int),       479001600(long)  13 的阶乘:      1932053504(int),      6227020800(long)  14 的阶乘:      1278945280(int),     87178291200(long)  15 的阶乘:      2004310016(int),   1307674368000(long)  16 的阶乘:      2004189184(int),  20922789888000(long) 最大整型:  2147483647, 最大长型: 9223372036854775807   这里, *      阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。N的阶乘可表示为n!=1×2×3×……×n 或 n!=n×(n-1)! *      用整型(int), 13的阶乘是: 6227020800,超过了 整型变量 int可以表示的最大正整数: 2147483647。 因此,13 或更大的阶乘数据,不能用整型int 表示。以上输出结果表明,用整型int变量存储的阶乘数据,若阶数超过12, 均不正确。 *      以上用长型变量输出的阶乘,尚且是正确的。但,它也有个限度, 17以上的阶乘, 就是“垃圾”了。 *     数学家定义,0!=1,所以0!=1! ######算法有问题,怎么判断素数,这个数学问题先搞清楚,然后再写程序,要不然全是乱的###### package test; public class Test { public static void main(String[] args) { String num = "素数:"; for(int i=2;i<=1000;i++){ //特殊值处理 if(i == 2){ num += i+","; //System.out.println("素数:"+i); }else{ //素数判断条件,从2开始除,取余,如果余值为0,表示不是素数,跳出这个数的循环判断, for(int j=2;j<i;j++){ if(i%j == 0){ break; } //判断是否是素数,能除到比该值小一,且余数不为0,肯定是素数 if(i%j != 0 && j == i-1){ num += i+","; //System.out.println("素数:"+i); } } } } System.out.println(num); } } //好人都是直接贴代码的 ###### 埃拉托色尼筛选法(Sieve of Eratosthenes) 也可以尝试。 import java.util.*; public class Eratosthenes{ // 埃拉托色尼筛选法 public static void main(String args[]){ int i,j; boolean b[]=new boolean[50]; for(i=0;i<b.length;i++) b[i]=true; //将数组的元素全部赋以true for ( i = 2; i < b.length; i++ ) // 从下标2开始递增循环 if ( b[ i ] ==true){// 每次找到值为true的元素 for (j =i+1;j < b.length;j++ ){ /* 就用其下标作为除数,去除往后余下的元素的下标*/ if (j%i == 0 ) //一旦能除尽 b[j] = false;// 将对应的元素值改为false } } for (i=2;i<b.length;i++ )//从2起,打印50以内的质数 if (b[ i ]) //若元素值为true System.out.printf("%4d", i);// 打印出该元素的下标 } } ###### 我已经将 tcxu 和 月生无界 所出示的代码,翻译成 PHP, 运行结果证明两种算法有效。 http://www.oschina.net/code/snippet_2756874_56652 ###### 查看楼主的代码发现, 你应当把 7 行的右花括号”}“,移到17行后边。这样,你的意向就对了: 从 第 9 行 至 第 17 行 处理 (k==0)的情况。从 18行 至 21 行,处理的是 (k != 0 的情况) ######k*(i%j)数值过大溢出了。 for(long j=2;j<i;j++){ k=i%j if(k==0) System.out.print(" "+i+"不是素数,有约数:"); break } ###### 不明白 ”k*(i%j)数值过大溢出了” 的情况 是什么情况? 指的是 这里的数值过大? 超过了 long型所能存储的最大数值 (2的63次方减 1)? 这里的数值并不大呀。 我这里没有安装Java环境,所以,参照楼主的代码,写出java脚本 代码,JavaScript 如下: 测试证明,楼主确实应当把 11 行 的 右花括号 ’ } ‘,移到 17 行:System.out.println(); 的后面。 <html> <head> <meta charset="gb2312"> <title>求1000以内的素数</title> <style> </style> </head> <body> <script>  var n=1; for (var i=1; i<1000;i++){ var k=1; for (var j=2;j<i;j++){ k=k*(i%j); } if (k==0){ //处理 不是素数的情况 document.write( i + " 不是素数,有约数: "); for (var j=2;j<i;j++) if (i%j==0){ document.write( j + " "); } document.write("<br>"); } else if (k !=0){ //处理素数的情况 document.write( "第 " + n +  " 个素数是:" + i + "<br>"); n++; } } </script> </body> </html> ######long取值范围:-9223372036854775808 -到9223372036854775807,明天再测试一下,long的最大值再乘其他数在代码中是否会变成0返回###### 引用来自“tcxu”的评论 月生无界正确地说出了long 型的取值范围。特此,我将从前写的代码展示如下, 来表明JAVA不同类型的变量的取值范围: public class Limits{        public static void main(String args[]){ /* 打印六种数字基本类型变量的最大值和最小值 */   System.out.println("长型最大值 LONG_Max: " + Long.MAX_VALUE); System.out.println("长型最小值 LONG_Min: " + Long.MIN_VALUE); System.out.println("整型最大值 Int_Max: " + Integer.MAX_VALUE); System.out.println("整型最小值 Int_Min: " + Integer.MIN_VALUE); System.out.println("短型最大值 SHORT_Max: " + Short.MAX_VALUE); System.out.println("短型最小值 SHORT_Min: " + Short.MIN_VALUE); System.out.println("字节型最大值 BYTE_Max: " + Byte.MAX_VALUE); System.out.println("字节型最小值 BYTE_Min: " + Byte.MIN_VALUE); //System.out.println("浮点型最大值 FLOAT_Max: " + Float.MAX_VALUE); //System.out.println("浮点型最小值 FLOAT_Min: " + Float.MIN_VALUE); //System.out.println("双精度型最大值 DOUBLE_Max: " + Double.MAX_VALUE); //System.out.println("双精度型最小值 DOUBLE_Min: " + Double.MIN_VALUE);        } } 输出:   长型最大值 LONG_Max: 9223372036854775807 长型最小值 LONG_Min: -9223372036854775808 整型最大值 Int_Max: 2147483647 整型最小值 Int_Min: -2147483648 短型最大值 SHORT_Max: 32767 短型最小值 SHORT_Min: -32768 字节型最大值 BYTE_Max: 127 字节型最小值 BYTE_Min: -128 ..........   就拿计算阶乘为例,以下代码,可以检查JAVA 输出数据的有效性。 public class Factoria { public static void main(String args[]) { //主方法代码块开始 int iFactoria=1;    //用整型存储阶乘 long lFactoria=1; //用长型存储阶乘 for (int i=1; i<17;i++){ //用for循环语句输出1到16的阶乘    iFactoria *=i;  //将i的阶乘存入整型变量    lFactoria *=i;  //将i的阶乘存入长型变量    /* 分别输出存于整型变量和长型变量的阶乘 */    System.out.printf(" %d 的阶乘:\t %10d(int), %15d(long)\n",        i, iFactoria, lFactoria);        }    System.out.printf("最大整型:%12d, 最大长型: %d\n",        Integer.MAX_VALUE,Long.MAX_VALUE);   }  //主方法 main 代码块结束结束 }  // 类 Factoria 定义结束   输出:   1 的阶乘:                1(int),               1(long)  2 的阶乘:                2(int),               2(long)  3 的阶乘:                6(int),               6(long)  4 的阶乘:               24(int),              24(long)  5 的阶乘:              120(int),             120(long)  6 的阶乘:              720(int),             720(long)  7 的阶乘:             5040(int),            5040(long)  8 的阶乘:            40320(int),           40320(long)  9 的阶乘:           362880(int),          362880(long)  10 的阶乘:         3628800(int),         3628800(long)  11 的阶乘:        39916800(int),        39916800(long)  12 的阶乘:       479001600(int),       479001600(long)  13 的阶乘:      1932053504(int),      6227020800(long)  14 的阶乘:      1278945280(int),     87178291200(long)  15 的阶乘:      2004310016(int),   1307674368000(long)  16 的阶乘:      2004189184(int),  20922789888000(long) 最大整型:  2147483647, 最大长型: 9223372036854775807   这里, *      阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。N的阶乘可表示为n!=1×2×3×……×n 或 n!=n×(n-1)! *      用整型(int), 13的阶乘是: 6227020800,超过了 整型变量 int可以表示的最大正整数: 2147483647。 因此,13 或更大的阶乘数据,不能用整型int 表示。以上输出结果表明,用整型int变量存储的阶乘数据,若阶数超过12, 均不正确。 *      以上用长型变量输出的阶乘,尚且是正确的。但,它也有个限度, 17以上的阶乘, 就是“垃圾”了。 *     数学家定义,0!=1,所以0!=1! 真有耐心,我只做了一个简单的测试,发现一些有趣的事情,希望得到正确的解答 上代码 long min = -9223372036854775808L; long max = 9223372036854775807L; System.out.println(min*1+","+min*2+","+min*3+","+min*4); System.out.println(max*1+","+max*2+","+max*3+","+max*4); 结果:-9223372036854775808,0,-9223372036854775808,0 9223372036854775807,-2,9223372036854775805,-4 long的最小最大值从1乘到4,会出现各种结果,不是很懂其中的原理
爱吃鱼的程序员 2020-06-03 16:40:47 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT